快速排序是用途最廣的排序演算法之一,但是在最壞的情況下快速排序會退化成直接插入排序時間複雜度也就將為了o(n^2).因此快速排序的改進也就是在選擇key元素上的選擇,選取乙個中位數可以保證快速排序演算法的效率。
改進方法:1.選取中衛數作為key
2.排序前可以先將key和最後乙個元素交換,將key元素放到最後這樣就可以減少乙個比較的元素。
#include#include//選取樞軸,將所有元素小於它的移到它的左邊,大於它的移到它的右邊,返回它的位置.
int partition(int a,int low,inthigh)
//選取樞軸位置,取首元素,中間元素和末尾元素的中值作為樞軸
int mid = low+(high -low) >> 1;
int firstelem = a[low];
int lastelem = a[high];
int midelem =a[mid];
int index = getmiddlevalue(a,low,high);//中位數的位置
//將樞軸元素放在第乙個位置
if(index != low)//交換
//定義兩個標記,乙個負責向後掃瞄,乙個負責向前掃瞄
//向後每遇到乙個比它大的就交換,向前掃瞄每遇到乙個比它小的就交換
int x = a[low];//樞軸元素
int flagl =low;
int flagh =high;
while(flagl = x &&flagl < flagh)//找到第乙個比樞軸小的元素,放到當前flagl的位置
flagh--;
if(flagl < flagh)
a[flagl++] =a[flagh];
else
break;
while(a[flagl] <= x &&flagl < flagh)//找到第乙個比樞軸大的元素,放到當前flagh的位置
flagl++;
if(flagl >1;
int y1=a[low]>a[mid]?low:mid;
int y2=a[low]>a[high]?low:high;
int y3=a[mid]>a[high]?mid:high;
if (y1==y2)
else
return a[y1]>a[y2]?y2:y1;
}
快速排序的改進
改寫partition演算法。要求 一次partition之後,小於基準元素key的數在左邊,等於key的在中間,大於key的在右邊 思路一 參照演算法導論上的思想,做出改進 i指向小於基準元素的序列的末尾,j指向等於基準元素的序列的末尾,k指向當前遍歷到的元素。include include us...
快速排序的改進
快速排序最壞情況下,要比較o n 2 次,但平均效能為nlogn,基本達到了比較類排序所需時間的的下界。核心 為 void qsort int data,int begin,int end int pivot,i,j if begin end return i begin j end pivot d...
快速排序改進
快速排序平均複雜度為o nlgn 最壞情況為o n 2 即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o nlogn 最壞情況下為o n 2 1.如果在排序時選取最後乙個元素為基準,則可以通過以下方法來避免劃分的不平衡。int ...