和快速排序打个交道
快速排序
----记得大二上课时候,这个排序折磨了我一阵,可能确实是没有学习的天赋吧,今天来解决它!gogogo!
一、排序思路:
快速排序(Quicksort)是由冒泡排序改进而得到的,它的基本思想是在待排序的n个元素中任取一个元素,我们通常取第一个元素,把该元素放入恰当位置后,数据序列被此元素划分成两部分,所有关键字比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分(这不是废话吗?)。之后对产生的两个部分分别重复上述过程,直至每部分只有一个元素或者为空为止。言简意赅,就是用递归吧。
二、步骤再阐述:
1、先从整个数组中取出一个数作为我们的基准。
2、比基准大的通通跑去右边,剩下的小可怜就都丢到左边。
3、递归操作,直至还剩一个元素或为空。
三、算法概述:
int partition(int data[],int low,int high) //一趟划分 { int temp; temp=data[low]; //以data[low]为基准 while(low<high){ //从两端开始交替进行扫描,直至low=high为止。 while(low<high&&data[high]>=temp) high--; //从右向左扫描,找一个小于temp的data[high] data[low]=data[high]; //找到这样的R[high],放入data[low]处 while(low<high&&data[low]<=temp) low++; //从左向右扫描,找一个大于temp的data[low] data[high]=data[low]; //找到这样的data[low],放入data[high]处 } data[low]=temp; return low; } void QuickSort(int data[],int low,int high) //对data[low..high]的元素进行递增快速排序 { int i; if (low<high) //区间内至少存在两个元素的情况 { i=partition(data,low,high); QuickSort(data,low,i-1); //对左区间递归排序 QuickSort(data,i+1,high); //对右区间递归排序 } }
四、我们把main函数写起来,然后把完整的程序运行一下如下:
int main() { int data[N]; int a[]={13,8,2,9,34,1,69,24,35,79}; int n = (int)(sizeof(a)/sizeof(*a)); for(int i=0;i<n;i++) data[i]=a[i]; printf("排序前:"); for (int i=0;i<n;i++) printf("%d ",data[i]); printf("\n"); QuickSort(data,0,n-1); printf("排序后:"); for (int i=0;i<n;i++) printf("%d ",data[i]); printf("\n"); return 1; }
结果确实是按照有序排列了,我们还可以考虑输出每一次划分的结果,这里就不一一描述了。