改寫partition演算法。要求:一次partition之後,小於基準元素key的數在左邊,等於key的在中間,大於key的在右邊
思路一:參照演算法導論上的思想,做出改進:i指向小於基準元素的序列的末尾,j指向等於基準元素的序列的末尾,k指向當前遍歷到的元素。
#include #include using namespace std;
void print(int *arr, int start, int end)
void randdata(int *arr, int start, int end)
int partition(int *arr, int start, int end)
else if (arr[k] == key)
}swap(arr[++j], arr[end]);
cout << "after partition:" << endl;
print(arr, start, end); //列印一次partition之後的陣列
cout << endl;
return j;
}void quicksort(int *arr, int start, int end) }
int main()
return 0;
}
思路二:中樞值設為第乙個,分離的時候從後向前找,當比它小時就交換。反之亦然。
#include #include #include void print(int a, int start, int end)
static int num=1;
int partition(int a,int i,int j)
{ printf("第【%d】分離前:",num);
print(a,i,j);
int m=i,n=j;
int provit=a[i];
while (i=provit)//注意此處為》=
當變成大於號時,才為題目所要求的,請讀者注意。
快速排序的改進
快速排序最壞情況下,要比較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 n 2 因此快速排序的改進也就是在選擇key元素上的選擇,選取乙個中位數可以保證快速排序演算法的效率。改進方法 1.選取中衛數作為key 2.排序前可以先將key和最後乙個元素交換,將key元素...
快速排序改進
快速排序平均複雜度為o nlgn 最壞情況為o n 2 即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o nlogn 最壞情況下為o n 2 1.如果在排序時選取最後乙個元素為基準,則可以通過以下方法來避免劃分的不平衡。int ...