标签:
18. 蛤蟆的数据结构进阶十八排序实现之快速排序
本篇名言:“一个人做点好事并不难,难的是一辈子做好事,不做坏事。--毛泽东”
我们最后来看下快速排序,以及各个排序之间的一些信息汇总。
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47817933
快速排序由C. A. R.Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
先通过函数partition函数将表一分为二(交替先给中间扫描,具体如果分法,请看源码)。
然后递归对低子表递归排序 ,递归对高子表递归排序 。
实现运行如下图1:
各种排序的稳定性,时间复杂度和空间复杂度总结,如下图2:
我们比较时间复杂度函数的情况,如下图3:
时间复杂度函数O(n)的增长情况,如下图4
所以对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法。
#include"stdio.h"
void print(inta[],intn){
for(intj= 0; j<n; j++){
printf("%d",a[j]);
}
}
void swap(int *a,int *b)
{
inttmp = *a;
*a =*b;
*b =tmp;
}
int partition(inta[],intlow, int high)
{
intprivotKey = a[low]; //基准元素
while(low< high){ //从表的两端交替地向中间扫描
while(low< high && a[high]>= privotKey) --high; //从high所指位置向前搜索,至多到low+1位置。将比基准元素小的交换到低端
swap(&a[low],&a[high]);
while(low< high && a[low]<= privotKey ) ++low;
swap(&a[low],&a[high]);
}
//print(a,10);
return low;
}
void quickSort(inta[],intlow, int high){
if(low< high){
intprivotLoc = partition(a, low, high); //将表一分为二
quickSort(a, low, privotLoc -1); //递归对低子表递归排序
quickSort(a, privotLoc + 1,high); //递归对高子表递归排序
}
}
int main(){
inta[10] = {3,1,5,7,2,4,9,6,10,8};
printf("初始值:");
print(a,10);
quickSort(a,0,9);
printf("\n排序结果:\n");
print(a,10);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/notbaron/article/details/47817933