題目描述
給定你乙個長度為n的整數數列。
請你使用快速排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~10
9'>109
範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1 ≤ n ≤ 1000001≤
n≤100000
'>1≤n≤100000
輸入樣例
3 1 2 4 5
輸出樣例
1 2 3 4 5
思路
快速排序時間複雜度o(n*logn),其思想是分治法,
該方法的基本思想是:
1.先從數列中取乙個數k作為基準數(一般是數列的第乙個數或中間那個數);
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊.
①k為第乙個數:設乙個頭指標i(此時i指向k),尾指標j,當i②k為中間那個數:設乙個頭指標i,尾指標j,當i=j;
3.再對左右區間重複第二步,直到各區間只有乙個數;
一般我選擇第乙個數作為基準值,不過在這裡超時了,**如下——
然後改用中間數作為基準值了,但是因為不怎麼用,所以出了bug,上個**以告誡自己,避免錯誤重犯,要仔細審題——
分析錯誤資料可知,數列中存在相等的數,因為是用while,所以當q[i]和q[j]都為k時,i和j都不會更新,導致while陷入死迴圈,所以i要自增,j要自減;不過看了一下題解發現基本上都是用do...while...寫的,所以說,平時不要只用一種寫法,其他的寫法也要熟悉,這樣才能隨機應變.
以下是ac**——
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;78
int q[100005];9
10void quicksort(int l, int
r) 19
//while...
20//
int i=l, j=r, k=q[l+r >> 1];
21//
while(1)
29quicksort(l, j);
30 quicksort(j+1
, r);31}
3233
intmain()
785 快速排序 c c
給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數 n。第二行包含 n 個整數 所有整數均在1 109範圍內 表示整個數列。輸出格式 輸出共一行,包含 n 個整數,表示排好序的數列。資料範圍 1 n 1000...
快速排序 Acwing785 快速排序
快排最壞情況為 o n2 本題若遇到最壞情況會超時,故我們需要優化快排,每次取中間的數,而不是取邊界的數 最壞情況分析 序列已經有序 每次取左區間的數進行快排,每次呼叫函式遍歷r l次,呼叫函式次數為n次,時間複雜度o n2 每次取中間的數進行快排,每次呼叫函式遍歷r l次,呼叫函式次數為logn次...
Acwing 785 快速排序
給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數 n。第二行包含 n 個整數 所有整數均在1 109109範圍內 表示整個數列。輸出格式 輸出共一行,包含 n 個整數,表示排好序的數列。資料範圍 1 n 1...