排序算法:快速排序

基本思想:


通过一趟排序将待排的记录划分为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序。

具体做法:

附设两个位置指示变量 i 和 j ,他们的初值分别指向文件的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为 pivotkey ,则首先从 j 所指位置起向前搜索,找到第一个关键字小于 pivotkey 的记录,将其向前移,然后从 i 所指位置起向后搜索,找到第一个关键字大于pivotkey 的记录,将其向后移,重复这两步直至 i 与 j 相等为止。

用快速排序方法对整型数组进行递增排序。

 1 void quicksort( int data[], int low, int high )
 2 /*用快速排序方法对数组元素data[low.high]作递增排序*/
 3 {
 4     int i, pivot, j;
 5     if ( low < high )
 6     {
 7         pivot = data[low]; i = low; j = high;      //以数组的第一个元素为基准进行划分
 8         while( i < j )
 9         {                                          //从数组的两端交替地向中间扫描
10             while(i < j && data[j] >= pivot)  j--; //找到第一个比枢轴元素小的元素
11             if (i < j) data[i++] = data[j];      //比枢轴元素小者移到低下标端
12             while(i < j && data[i] <= pivot)  i++; //找到第一个比枢轴元素大的元素
13             if(i < j) data[j--] = data[i];       //比枢轴元素大者移到高下标端
14         }
15         
16         data[i] = pivot;     //枢轴元素移到正确的位置
17         quicksort(data, low, i-1);   //对前半个子表进行快速排序(递归调用)
18         quicksort(data, i+1, high);   //对后半个子表进行快速排序
19     }
20 } 
21        

快速排序小结:

快速排序算法的时间复杂度为O(nlog2n),在所有算法复杂度为此数量级的排序算法中,快速排序被认为是平均性能最好的一种。但是,若初始记录序列按关键字有序或基本有序时,即每次划分都是将序列划分为某一半序列的长度为0的情况,此时快速排序将蜕变为冒泡排序,算法的时间复杂度为O(n²)。快速排序是不稳定的排序方法。

原文地址:https://www.cnblogs.com/xiehuan-blog/p/9005855.html