C语言快排
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; }
了解了思想之后可以拓展双关键字快排。见博客。