洛谷 P1177 模板 快速排序

2022-07-29 04:48:11 字數 1406 閱讀 7864

題目所在**:

題面說是快排的板子題,可將純純快排的板子扔上去之後 t 的一塌糊塗...看來沒這麼簡單。

對於快排,我的理解,一趟快排所做的事(從結果上來看)就是:把標準值扔到它最終該待的地方並且使它左邊的值都小於它,右邊的值都大於它。把這個過程扔到遞迴中去做足夠多的的次數,就能夠使一串數字排好順序。

我們知道,快排的時間效率會隨給定的數列特徵不同而變化:

如何讓我們的快排小兄弟不再怕這種情況?有兩種思路:

1、資料雖然很不友好,但我們設法在選取標準值的時候盡量隨機。

int key = arr[(rand() % (high - low + 1)) + low];

對於本題,你甚至可以這麼寫:

int key = arr[(low + high) / 2];

2,讓資料變得友好

拿到資料之後,我們可以人為的將其打亂,這個過程花費o(n),但由於 打亂資料 和 快排 是順序的關係,不會影響到整體的時間效率。

void disrupt(int arr, int n)

}

這樣的快排板子,便能夠順利的通過本題。

附上完整ac**:

#include

#include

#include

#include

#include

using

namespace

std;  

void

disrupt(

intarr, 

intn)  

}  void

quick_sort(

intarr, 

intlow, 

inthigh)  

while

(arr[j] > key);  

do  

while

(arr[i] < key);  

if(i < j)swap(arr[i], arr[j]);  

else

break

;  }  

quick_sort(arr, low, i - 1);  

quick_sort(arr, j + 1, high);  

}  int

num[100000 + 5];  

intmain()  

disrupt(num, n);  

quick_sort(num, 0, n - 1);  

for(

inti = 0; i < n; i++)   

return

0;  

}  

洛谷 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 因為快排對於一些特殊的情況 例如序...

洛谷 P1177 模板 快速排序

利用快速排序演算法將讀入的 n 個數從小到大排序後輸出。快速排序是資訊學競賽的必備演算法之一。對於快速排序不是很了解的同學可以自行上網查詢相關資料,掌握後獨立完成。c 選手請不要試圖使用stl,雖然你可以使用sort一遍過,但是你並沒有掌握快速排序演算法的精髓。第 1 行為乙個正整數 n,第 2 行...