785 快速排序

2022-06-05 05:36:07 字數 2057 閱讀 1468

題目描述

給定你乙個長度為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 6

using

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...