p1177 【模板】快速排序
實現快速排序
快速排序的排序思想大致可以分為一下幾部分
以陣列中某乙個數k為標準,通過調整陣列中元素位置,讓陣列中元素的大小分布涇渭分明,左邊小於(等於)k,右邊大於(等於)k。這樣對於整個陣列而言就達到了基本有序的狀態。之所以稱為基本有序,是指左右兩子陣列的相對位置確定了下來,在正確的排序下,左陣列的元素不會到右陣列中去,右陣列的元素不會到左陣列中去。
分別對第一步提到的左陣列和右陣列再做類似的排序工作,使它們也達到基本有序。
對排序產生的子陣列重複進行第二步,直到子陣列的長度小於等於1。此時,整個陣列就達到了完全有序。
標準數的選擇,可以隨機選擇,也可以固定位置,比如每次選最左邊的數,或是選最中間的數。平均來看,怎麼選擇都無所謂,但對於部分資料而言,選擇的方式不同複雜度也會不同。比如原本就是有序的陣列,如果選最左邊的,一共遞迴n次,遞迴的陣列長度從n遞減到1,所以是(1+n)n/2。而如果選擇最中間的數,那就是二分,一共遞迴log(2)n次,每次遞迴中需要遍歷的元素為n個,所以是nlog(2)n。本題中,有些資料就是類似有序的,所以我選擇了去中間的數最為標準數。
#include
using
namespace std;
int n;
int array[
100010];
int ic =0;
void
sort
(int left,
int right)}if
(j > left)
sort
(left, j);if
(right > i)
sort
(i, right);}
intmain()
sort(0
, n-1)
; cout << array[0]
;for
(int i =
1;i) cout << endl << ic;
return0;
}
(排序)P1177 模板 快速排序
題解 這道題用傳統快排 如下所示 的結果就是最後三個點tle 如果永遠取第乙個元素作為樞軸的話,在陣列已經有序的情況下每次劃分都將得到最壞的結果,時間複雜度退化為o n 2 因為其中乙個子串行每次都只比原序列少乙個元素,該側的遞迴深度將達到最大。include using namespace std...
洛谷 P1177 模板 快速排序
洛谷 p1177 模板 快速排序 1.翻書,該題很容易解決,但不算掌握。2.憑空編寫,邊界點的取值有些問題,等號去還是不取。3.想了乙個辦法,寫出一組資料進行手動模擬,弄明白了,程式再開始根據模擬進行編制。4.很久沒寫快排了,如果能一次性編寫成功,這次可以說快排掌握了。5.開始動手,6.第一次取a ...
洛谷 P1177 模板 快速排序
這道題用傳統快排 如下所示 的結果就是最後三個點tle void swap int a,int b void quicksort int a,int left,int right quicksort a,left,i 1 quicksort a,j 1,right 因為快排對於一些特殊的情況 例如序...