QuickSort 優化後的快速排序演算法

2021-07-29 11:03:20 字數 1284 閱讀 2129

1.優化選取樞軸

防止在第一次迴圈後,整個序列沒有實質性的變化,如例子中的序列,則採用三數取中法(median-of-three)。即取三個關鍵字先進行排序,將蹭數作為樞軸,一般是取左端、右端和中間三個數,也可以隨機選取。也有九數取中(median-of-nine)。

優化**塊如下:

int partition(int *p, int low, int high)

if (*(p + m) > *(p + high))

if (*(p + m) > *(p + low))

//以下**是增加的對選取樞軸的優化

pivotkey = *(p + low);//設定傳進來的陣列中第乙個數為樞軸變數

while (low < high)

swap(*(p + low), *(p + high));//交換值

while (low < high&&*(p + low) <= pivotkey)

swap(*(p + low), *(p + high));

}return low;//返回樞軸

}

2.優化不必要的交換

在進行迴圈時,可以先將樞軸值儲存起來,將交換改為賦值

優化**塊如下:

int partition(int *p, int low, int high)

*(p + low) = *(p + high);//採用替換面不是交換的方式進行操作

while (low < high&&*(p + low) <= pivotkey)

*(p + high) = *(p + low);//採用替換面不是交換的方式進行操作

}*(p + low) = tmp;//將樞軸數值替換給*(p+low)

return low;//返回樞軸

}

3.優化小陣列時的排序方案

在陣列元素個數小於50時,可以選擇直接用插入排序,這樣就能保證最大化地利用兩種排序的優勢來完成排序工作。

優化**塊如下:

#define max_length_insert_sort 50//設定乙個分界點

void qsort(int *p,int low,int high)

else

}

4.優化遞迴操作

實際**就不上了,改的時間有bug。。。

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...