赞
踩
#include<stdio.h> #include<stdlib.h> void quicksort(int *a, int left, int right); void swap(int *a,int i,int j); int randpartition(int *a, int left, int right); int main() { int a[]={81,94,11,96,12,35,17}; int N=sizeof(a)/sizeof(int); int i,j; quicksort(a, 0, N-1); for(i=0;i<N;i++) printf("%d ",a[i]); } //快排 void quicksort(int *a, int left, int right) { if (left < right) { int p = randpartition(a, left, right); quicksort(a, left, p - 1); quicksort(a, p + 1, right); } } //快排数组划分 int partition(int *a, int left, int right) { int x = a[right];//选择主元,选择最右边的一个 int p = left - 1;//保存了一个变量,记录比主元小的所有元素中,在序列中存放的位置最靠右的那个 for (int i = left; i < right; i++) {//从当前序列的第一个循环到倒数第二个(right-1)元素,来进行和主元比较。 if (a[i] <= x) { p++; swap(a, p, i);//把a[i]和a[p]交换,就是说把a[p]右边的元素和当前元素换位置 } } //循环结束,整个序列就变成了三部分,从a[left..p]是比主元小的元素,a[p+1..right-1]是比主元大的元素,a[right]则是主元。 swap(a, p+1, right); //将主元和比它大序列的第一个元素互换位置 return p+1; } //交换数组a中的a[i]和a[j] void swap(int *a,int i,int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } //快排数组随机划分 int randpartition(int *a, int left, int right) { int r = rand()%(right);//生成一个随机数,即是主元所在位置 swap(a,right,r);//将主元与序列最右边元素互换位置,这样就变成了之前快排的形式。 return partition(a,left,right);//直接调用之前的代码 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。