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 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...