這一章的正文及思考題部分講到了快速排序及其幾種變形,包括:hoare快排,
普通快排,隨機快排,三數取中快排。
這些快排的區別主要是劃分方法partition演算法的不同:如何選取主元,劃分出的
兩部分範圍是什麼。根據劃分出的範圍不同,各變形的quicksort有微小的差別。
1. hoare快排
hoare劃分是最初的版本,與《演算法導論》中的劃分版本相比,它選取第乙個元素a[p]為主元。
劃分後的兩部分是:a[p..j]和a[j+1..r],主元可能放入某乙個之中。
int hoare_partition(int a, int p, int r)
}void hoare_quick_sort(int a, int p, int r)
}
2. 普通快排
選取最後乙個元素a[r]為主元後,j 從頭遍歷到尾,i 是兩範圍的分隔。
劃分結果為[p, q - 1]和[q + 1, r]。
int partition(int a, int p, int r)
}swap(a, i + 1, r);
return i + 1;
}void quick_sort(int a, int p, int r)
}
3. 隨機快排
通過標頭檔案stdlib.h中的rand()方法生成[p, r]之間的隨機數作為主元。
rand() % n 將生成 [0, n)之間的隨機數。
為了重用partition方法,將選定的主元交換到位置 r。
int randomized_partition(int a, int p, int r)
void randomized_quick_sort(int a, int p, int r)
}
4. 三數取中快排
每次劃分前,從當前子陣列裡隨機取出三個數,取這三個數的中間數作為主元的索引。
int median_partition(int a, int p, int r)
void median_quick_sort(int a, int p, int r)
}//測試方法
int main(void)
; print(a, size);
//hoare_quick_sort(a, 0, size - 1);
//quick_sort(a, 0, size - 1);
//randomized_quick_sort(a, 0, size - 1);
median_quick_sort(a, 0, size - 1);
print(a, size);
return 1;
}
《演算法導論》第7章 快速排序 四種變形
這一章的正文及思考題部分講到了快速排序及其幾種變形,包括 hoare快排,普通快排,隨機快排,三數取中快排。這些快排的區別主要是劃分方法partition演算法的不同 如何選取主元,劃分出的 兩部分範圍是什麼。根據劃分出的範圍不同,各變形的quicksort有微小的差別。1.hoare快排 hoar...
演算法導論 第7章 快速排序
一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,排序最快,也只能達到o nlgn 二 快速排序演算法的描述 ...
演算法導論 第7章快速排序
1 演算法描述 快速排序也是基於分治模式的,下面是乙個典型子陣列a p.r 排序的分治過程,主要分為三個步驟 1 分解 將陣列a p.r 劃分成兩個子陣列a p.q 1 和a q 1.r 使得前乙個陣列中每個值都小於等於a q 後乙個陣列每個值都大於a q 下標q也在這個分解過程中求得。2 解決 通...