C語言使用快排的方式有兩種,1、直接用庫函數stdlib.h里的qsort函數 2、自己編寫快排代碼(第一種方便,第二種較為自由)
qsort 的函數原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的參數為:
1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的占用空間大小
4 指向函數的指針,用於確定排序的順序
下面附上樣例代碼:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int comp(const void*a,const void*b) 4 { 5 return *(int*)a-*(int*)b; 6 } 7 int main() 8 { 9 int *array; 10 int n; 11 scanf("%d",&n); 12 array=(int*)malloc(n*sizeof(int)); 13 int i=0; 14 for(;i<n;i++) 15 { 16 scanf("%d",(array+i)); 17 } 18 qsort(array,n,sizeof(int),comp); 19 for(i=0;i<n;i++) 20 { 21 printf("%d\t",array[i]); 22 } 23 free(array); 24 array=NULL; 25 return 0; 26 }
另外自己編一個快排代碼也是很方便的,對於初學者學會快排代碼也是很有必要的。
下面說一下快排的基本思想。快排是冒泡的改進版,基本思想是選中要排序序列中的一個數,然后讓它左邊的數都比它小,右邊的數都比它大(如果要降序的話就反之),如此遞歸即可。下面附上代碼:
#include<stdio.h> void qsort(int *a,int l,int r) { int i=l; int j=r; int mid=a[(l+r)/2]; int temp; while (i<j) { while (a[i]<mid) i++; while (a[j]>mid) j--; if (i<=j) { temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--; } } if (l<j) qsort(a,l,j); if (i<r) qsort(a,i,r); } int main() { int n; scanf("%d",&n); int a[11]={}; int i; for (i=1;i<=n;i++) { scanf("%d",&a[i]); } qsort(a,1,n); for (i=1;i<=n;i++) { printf("%d |",a[i]); } return 0; }
了解了思想之后可以拓展雙關鍵字快排。見博客。
