演算法學習 1 3最常用的排序 快速排序

2021-10-06 12:04:21 字數 1357 閱讀 6478

上一節的氣泡排序雖然解決了桶排序的空間浪費問題,但是在演算法的執行效率上卻犧牲了很多,今天來學習一種新的演算法,快速排序。他雖然最大時間複雜度和氣泡排序一樣,但是普通情況卻無疑將效率提高了好多。

下面我們來舉例,將6 1 2 7 9 3 4 5 10 8這一串數字進行排序:

進行快速排序的時候首先要找個基準數,其實就是乙個相對的比較數,按照習慣和平常的效率一般選擇第乙個數。

方法很簡單,分別從初始序列兩端開始探測,先從右往左找乙個小於6的數,再從左往右找乙個大於6的數,然後交換他們。

方法:用兩個變數i,j分別指向序列最左邊和最右邊。

下面來看流程:

這是乙個數的交換過程,當他們相遇的時候,將相遇位置的數和6交換位置即可。以此類推

注:一定是右邊的數(j)開始先動。如果是i開始動的話會發現排序之後左邊的數並不是小於6,右邊的數也不是大於6。

下面上**實現:

#include

int a[

101]

, n;

void

quicksort

(int left,

int right)

temp = a[left]

; i = left;

j = right;

while

(i != j)

while

(a[i]

<= temp && i < j)

if(i < j)

} a[left]

= a[i]

; a[i]

= temp;

quicksort

(left, i -1)

;quicksort

(i +

1, right)

;return;}

intmain()

quicksort(1

, n)

;printf

("\n");

printf

("排序後:");

for(i =

1; i <= n; i++

)return0;

}

結果:

我們從該排序演算法的思想中可以很清晰的明白,改**是需要用到遞迴的思想的。

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

演算法學習 快速排序

1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...

排序演算法學習 快速排序

快速排序 作為氣泡排序的一種改進 通過設定乙個標誌值 通常為陣列第乙個元素pivot 一次快排將陣列分成兩個部分,一部分 公升序 前一部分 小於標誌值pivot,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...