快速排序:
快速排序(Quick Sort)是對起泡排序的一種改進。它的基本思想是,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
起泡排序可參考:https://blog.csdn.net/ZipayYu/article/details/99241009
代碼實現:
說明:本博客的代碼實現貼近數據結構(C語言版) 課本代碼風格,使用抽象數據類型。
項目結構
以下文件代碼與直接插入排序時所用相同,爲避免大量代碼重複此處不再附上。
詳情可參考直接插入排序:https://blog.csdn.net/ZipayYu/article/details/98245056
status.h
ststus.cpp
SequenceListType.h
SequenceListType.cpp
快速排序的實現方式一
本部分是按照課本所示代碼實現。
/************************************
* 函數名稱: Partition
* 函數說明: 交換順序表L中的子表L.r[low]~L.r[high]的記錄,
* 函數說明: 樞軸記錄到位,並返回其所在的位置,
* 函數說明: 此時在他之前(後)的記錄均不大(小)於它。
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: int
* 函數參數: SqList & L
* 函數參數: int low
* 函數參數: int high
*************************************/
int Partition(SqList &L, int low, int high) {
L.r[0] = L.r[low]; //用子表的第一個記錄作樞軸記錄
int pivotkey = L.r[low].key; //樞軸記錄關鍵字
while (low < high) { //從表的兩端交替的向中間掃描
while (low < high&&L.r[high].key >= pivotkey) //在高端尋找比樞軸記錄小的記錄
{
--high;
}
L.r[low] = L.r[high]; //將比樞軸記錄小的記錄移到低端
while (low < high&&L.r[low].key <= pivotkey) //在低端尋找比樞軸記錄大的記錄
{
++low;
}
L.r[high] = L.r[low]; //將比樞軸記錄大的記錄移到高端
}
L.r[low] = L.r[0]; //樞軸記錄到位
return low;
}
/************************************
* 函數名稱: QSort
* 函數說明: 對順序表L中的子序列L.r[low]~L.r[high]作快速排序
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: void
* 函數參數: SqList & L
* 函數參數: int low
* 函數參數: int high
*************************************/
void QSort(SqList &L, int low, int high) {
if (low < high) { //長度大於1
int pivotkey = Partition(L, low, high); //將L.r[low]~L.r[high]一分爲二
QSort(L, low, pivotkey - 1); //對低子表遞歸排序,pivotkey是樞軸位置
QSort(L, pivotkey + 1, high); //對高子表遞歸排序,pivotkey是樞軸位置
}
}
/************************************
* 函數名稱: QuickSort
* 函數說明: 對順序表L作快速排序
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: void
* 函數參數: SqList & L
*************************************/
void QuickSort(SqList &L) {
QSort(L, 1, L.length);
}
data.txt
第一個數表示順序表數據個數,後面的數據爲實際的待排序數據
8 49 38 65 97 76 13 27 49
測試
int main() {
int delta[] = { 5, 3, 2, 1 };
SqList L;
printf("排序前數據:");
CreateSortList(L); //初始化數據
Print(L); //輸出初始數據
QuickSort(L); //執行排序
printf("排序後數據:");
Print(L); //輸出排序後數據
system("pause");
return 0;
}