算法快排。
以前的我總以為排序就是指代冒泡排序。
直到寫到了一題排序的題,提交答案直接給我時間超時間。。。後來再知道快速排序這個東西。
於是,我搞了一個下午才弄懂了這個算法(我是一個極水的人),所以來博客寫上自己的思路鞏固一下自己對著方面的認識。
快速排序:
簡稱快排,顧名思義,就是時間復雜度低,與冒泡排序相比之下,該算法更適合為一些長的沒有序的數組進行排序。
思想:
我是先前設一個start 和end 分別記錄數組的首尾。我們在隨便選擇一個作為比較。
我這裏就把start作為比較,其實很簡單,就是將比start大的放在他後面,比他小的放在他前面,這樣進行一次調用就能將這個start的最終的位置決定,當然調用一次我們得到的依然是沒有序的數組,所以要進行多次的調用,在這裏又一個叫做分治算法(因為start最後的位置不在首尾,那麽就把原先的數組一分為2,然後我們分別對左,右邊進行快排。)
代碼如下:
int quicksort(int a[],int start,int end)
{
int i,j,x=a[l];
i=start; j=end;
if (start>=end)
return ;
while (start<end)
{
while (i<j&&a[j]>=x) j--;
a[i]=a[j];
a[j]=x;
i++;
while (i<j&&a[i]<=x) i++;
a[j]=a[i];
a[i]=x;
j--;
}
quicksort(a,start,i-1);
quicksort(a,i+1,end); //此處只二分一次,後面不再二分,因為初始值(i等)會改變 ,會影響後面的排序。
}
*********************************該處是我後來補充**********************************
其實快排有頭文件包含了,比如c++ 的qsort(n,n+p) 但是我說的不是這個,下面的又一個方法
先附上代碼:
#include<stdio.h>
#include<stdlib.h> //該有文件包含了qsort等需要的成分
int cmp(const void*a,const void*b) //cmp 不是一定,可以改成其他,例如cmp改成mmp都是可以的, // 但是下面的 qsort中 的cmp也要相應變化
{
return (*(int *)a-*(int *)b); // a-b是正序 b-a是倒敘
}
int main()
{
int n,i,a[1010];
scanf ("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
for (i=0;i<n;i++)
printf ("%d ",a[i]);
return 0;
}
算法快排。