排序 快速排序

2021-07-29 14:26:20 字數 1945 閱讀 9059

時間複雜度

快速排序每次將待排序陣列分為兩個部分:

1、在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。

2、在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素, 快速排序將不幸退化為氣泡排序,最壞情況為o(n^2)。

快速排序的平均時間複雜度為o(nlogn)。

空間複雜度

快速排序在對序列的操作過程中只需花費常數級的空間。

空間複雜度s(1)。

但需要注意遞迴棧上需要花費最少logn最多n的空間。

排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用第乙個資料)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即 key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1),找到第乙個小於key的值a[j],並與a[i]交換;

4)從i開始向後搜尋,即由前開始向後搜尋(i=i+1),找到第乙個大於key的a[i],與a[j]交換;

5)重複第3、4、5步,直到 i=j; (3,4步是在程式中沒找到時候j=j-1,i=i+1。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j+完成的最後另迴圈結束)

例如:待排序的陣列a的值分別是:(初始關鍵資料:x=49) 注意關鍵x永遠不變,永遠是和x進行比較,無論在什麼位子,最後的目的就是把x放在中間,小的放前面大的放後面。

a[0] 、 a[1]、 a[2]、 a[3]、 a[4]、 a[5]、 a[6]:

49 38 65 97 76 13 27

進行第一次交換後: 27 38 65 97 76 13 49

( 按照演算法的第三步從後面開始找)

進行第二次交換後: 27 38 49 97 76 13 65

( 按照演算法的第四步從前面開始找》x的值,65>49,兩者交換,此時:i=3 )

進行第三次交換後: 27 38 13 97 76 49 65

( 按照演算法的第五步將又一次執行演算法的第三步從後開始找

進行第四次交換後: 27 38 13 49 76 97 65

( 按照演算法的第四步從前面開始找大於x的值,97>49,兩者交換,此時:i=4,j=6 )

此時再執行第三步的時候就發現i=j,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。

快速排序就是遞迴呼叫此過程——在以49為中點分割這個資料序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部資料序列的快速排序,最後把此資料序列變成乙個有序的序列,根據這種思想對於上述陣列a的快速排序的全過程如圖6所示:

初始狀態

進行一次快速排序之後劃分為 49

分別對前後兩部分進行快速排序 經第三步和第四步交換後變成 完成排序。

經第三步和第四步交換後變成 完成排序。

自己的**:

#includeint data[1000];

void quicksort(int

left,int

right);

int main()

void quicksort(int

left,int

right)

}data[left] = data[i];

data[i] = temp;

quicksort(left,i-1);

quicksort(i+1,right);

return;

}

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...

排序 快速排序

定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...

排序 快速排序

高快省的排序演算法 有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它...