僅僅在原來的快速排序基礎上增加了取隨機數為劃分點,改進了原有快排使用第乙個元素作為劃分元素的缺點,即減少了遇到最壞情況的可能。
#include
#include
using
namespace std;
#define n 20 // 最大陣列個數
#define multiplier 0x015a4e35l
#define increment 1
static
unsigned
long seed;
/* 生成隨機數種子 */
void random_seed
(unsigned
long d
)else }
/* 生成乙個low~high範圍內的隨機數 */
unsigned
int random
(unsigned
long low,
unsigned
long high
) /*
* 按樞點元素劃分序列
* 輸入:陣列a,序列的起始位置low,終止位置high
* 輸出:按樞點元素劃分的序列a,樞點元素位置i */
template
int split
(type a
[], int low,
int high
) }}
swap
(a[low
], a[i]
);
return i;
} /*
* 初始化隨機數並執行快排
* 輸入:陣列a,序列的起始位置low,終止位置high
* 輸出:排序好的序列a */
template
void quicksort_random
(type a
[], int low,
int high
) /*
* 隨機選擇樞點的快速排序
* 輸入:陣列a,序列的起始位置low,終止位置high
* 輸出:排序好的序列a */
template
void r_quicksort
(type a
[], int low,
int high
) }int main
()
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...
經典快速排序演算法與隨機快速排序演算法
快速排序用到了分治思想,同樣的還有歸併排序。乍看起來快速排序和歸併排序非常相似,都是將問題變小,先排序子串,最後合併。不同的是快速排序在劃分子問題的時候經過多一步處理,將劃分的兩組資料劃分為一大一小,這樣在最後合併的時候就不必像歸併排序那樣再進行比較。但也正因為如此,劃分的不定性使得快速排序的時間複...
快速排序的改進 隨機快速排序
快速排序是一種高效的排序方法,但是如果我們的輸入陣列是排好序的乙個陣列,快速排序的執行時間就會變成o n 2 雖然這種情況很少會出現,但我們還是應該避免。演算法導論書籍中的修改方法 在排序方法中隨機化選取主元。根據計算,改進後的方法時間複雜度的期望為o nlgn 下面是改進後的 快速排序 publi...