#排序算法#【4】快速排序
快速排序法是对冒泡排序的一种改进,本来是要和冒泡排序写在一个文章里的,不过前两天刚开始在递归调用的时候没有完全理解,昨天晚上google了一把发现原来自己理解错了,我看的这个教材没有写清楚,今天早上调试了一把终于成功。
快速排序算法的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。
上图中只是以69为基准数的两个步骤的图示,其实一遍下来以后,应该是比69小的都排在它左边,比69大的都排在它的右边。
贴上一张在万能的百度中找到的关于快速排序的动画图,可能稍微好理解一些:
具体代码如下:
1 #include <stdio.h> 2 #include "CreateData.c" //生成随机数文件 3 4 #define MAXSIZE 10 5 6 //快速排序分割出基准数下标 7 int Partition(int a[],int left,int right){ 8 int base; 9 base = a[left]; 10 while(left < right){ 11 while(a[right]>base && left<right) //右边的数大于基准数 12 right--; 13 a[left] = a[right]; 14 15 while(a[left]<base && left<right) 16 left++; 17 a[right] = a[left]; 18 } 19 20 a[left] = base; //保存基准数 21 22 return left; 23 } 24 25 //快速排序算法实现 26 void QuickSort(int a[],int left,int right){ 27 int i; 28 29 if(left < right){ 30 i = Partition(a,left,right); 31 32 QuickSort(a,left,i-1); 33 QuickSort(a,i+1,right); 34 } 35 } 36 37 int main(){ 38 int a[MAXSIZE]; 39 int i; 40 41 if(!CreateData(a,100,10,MAXSIZE)){ 42 printf("生成随机数失败\n"); 43 return 0; 44 } 45 46 printf("排序前:"); 47 for(i = 0 ; i<MAXSIZE ;i++) 48 printf("%d ",a[i]); 49 50 QuickSort(a,0,MAXSIZE-1); 51 52 printf("\n排序后:"); 53 for(i = 0 ; i<MAXSIZE ;i++) 54 printf("%d ",a[i]); 55 56 return 1; 57 }
时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)快速排序对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
通常是用于排序的最佳选择。因为,基于比较的排序,最快也只能达到O(nlgn)。