排序算法:快速排序
基本思想:
通过一趟排序将待排的记录划分为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序。
具体做法:
附设两个位置指示变量 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²)。快速排序是不稳定的排序方法。