分治與遞迴 快速排序

2021-07-26 12:30:25 字數 1710 閱讀 3274

快速排序的基本思想可以這樣來理解:對一組待排序元素,選定其中乙個元素x為基準,將小於x的元素移動到其左邊,將大於x的元素移動到其右邊,然後對於x左邊與右邊的序列進行上述的操作直至排序完成。

該演算法時間複雜度最壞的情況出現在待排序列為正序或者逆序時。此時的時間複雜度為o(n2)

平均時間複雜度為o(nlogn)

源**如下:

#includeusing namespace std;

void swap(int &a, int &b)

/*劃分函式*/

int partition(int *array, int l, int r)

array[l] = array[j];

array[j] = x;

return j;

}/*快速排序函式*/

void quicksort(int *array,int l,int r)

}void main()

; cout << "排序前:" << endl;

for(int i=0;i<10;i++)

cout << endl;

quicksort(temp, 0, 9);

cout << "排序後:" << endl;

for (int i = 0; i<10; i++)

cout << endl;

system("pause");

}

改進:如果每一次劃分都產生一邊是n-1個元素一邊是1個元素的情況那麼時間複雜度將變為o(n2),這顯然不是我們所期望的,如果每次劃分的兩個區域大小為n/2那麼時間複雜度將變為o(nlogn)。所以,快速排序演算法的效能取決於劃分的對稱性。上述的**中始終是以待排序列的第乙個元素作為劃分基準進行劃分的,通過修改劃分函式,可以設計出採用隨機選擇策略的快速排序演算法,即在快速排序演算法的每一步中當陣列還沒劃分時,在待排序列隨機選出乙個劃分基準,這樣可以使劃分基準是隨機的,從而可以期望劃分是較對稱的

利用了隨機劃分的快速排序演算法(10萬個隨機數)

#include#include#includeusing namespace std;

/*功能:生成隨機數並存入檔案

*這裡只是想試試這個方法

*可以替換成別的產生隨機數的方法

*/void randmoize()

; fout.close();

}int temp[100000]; //存放待排序隨機數的陣列

/*讀取檔案中的隨機數並存入陣列*/

void readfile()

fin.close();

}void swap(int &a,int &b)

/*劃分函式*/

int partition(int *array, int l, int r)

array[l] = array[j];

array[j] = x;

return j;

}/*隨機分組*/

int randomizedpartition(int array, int l, int r) //隨機分組

/*快速排序函式*/

void quicksort(int *array, int l, int r)

}void main()

f.close();

}

遞迴與分治 快速排序

描述 給定乙個數列,用快速排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。輸入樣例 5 3 2 1 4 5 輸出樣例 1 2345 基本思想 讓數列中的乙個數成為劃分基準,比這個基準...

分治與遞迴之快速排序

第一種思路 演算法描述 快速排序首先選擇陣列第乙個元素為基準元素,從游標1從第2個元素開始,游標2從最後乙個元素開始掃瞄,但游標1找到比基準元素大,停止掃瞄,游標2開始掃瞄,找到比基準元素小的元素,停止掃瞄,交換兩個元素,以此類推,但游標1的下標大於或等於游標2,則基準元素與當前游標2為下標的元素交...

ACM 歸併排序與快速排序(遞迴與分治)

歸併排序的內容可在紫書p226裡面檢視,紫書裡的 寫得十分簡潔,高效,重點要理解好循壞條件的控制。快排可參考以下的部落格 歸併排序時間複雜度 o nlogn 快排時間複雜度 平均o nlogn 最慢o n 2 歸併排序穩定但佔空間比較大,快排佔空間較小但不穩定。以下為 實現 includeusing...