快速排序的兩種演算法

2021-10-06 05:33:23 字數 1635 閱讀 1640

假設我們現在對「6 1 2 7 9 3 4 5 10 8」這個10個數進行排序。先將第乙個數當成基準數,然後以i, j當成哨兵分別指向陣列的首尾,第一次讓j先移動,移動到比基準數小的數字時停下,然後讓i移動至比基準數大的數字停下,交換arr[i]和arr[j],一直遍歷,知道i和j兩個哨兵相遇停止,然後讓基準數和i和j相遇的值交換,完成第一次遍歷,然後進行遞迴分別計算左右兩個小陣列。下面上**,方便大家理解:

#include

int a[

101]

,n;//定義全域性變數,這兩個變數需要在子函式中使用

void

quicksort

(int left,

int right)

temp = a[left]

;//temp中存的就是基準數

i = left;

j = right;

while

(i !=j )

//再從左往右找

while

(a[i]

<= temp && i//交換兩個數在陣列中的位置

if(i < j)

}//最終將基準數歸位

a[left]

= a[i]

; a[i]

= temp;

quicksort

(left, i-1)

;//繼續處理左邊的,這裡是乙個遞迴的過程

quicksort

(i+1

, right)

;//繼續處理右邊的,這裡是乙個遞迴的過程

}int

main()

quicksort(1

, n)

;//快速排序呼叫

//輸出排序後的結果

for(i =

1; i <= n; i++

)return0;

}

這個和交換法很像,不過這個不像交換法一樣待兩個數都確定後交換,而是發現乙個就將它提出來,將它放到應該放到的位置,然後再調整下乙個該調整位置的數字。具體**如下:

(區別可以自行看**)

#include

int arr[

101]

,n;//定義全域性變數,這兩個變數需要在子函式中使用

void

quicksort

(int left,

int right)

if(i < j)

while

(i < j && arr[i]

< temp)

if(i < j)

} arr[i]

= temp;

quicksort

(left, i -1)

;// 遞迴呼叫

quicksort

(i +

1, right);}

}int

main()

quicksort(1

, n)

;//快速排序呼叫

//輸出排序後的結果

for(i =

1; i <= n; i++

)return0;

}

想必大家在看完這兩種不同的快速排序後,肯定會對這種排序有比較深刻的認識吧。

兩種快速排序

快排是一種基於交換的排序,氣泡排序 兩兩相鄰作比較,逆序則交換 也是基於交換的排序,快排運用了二分法的思想,每次找乙個哨兵,比哨兵小的放一邊,大的放一邊,這是完成了一趟快排。冒泡 for int i 0 ia j 1 快排一 void quicksort int left,int right if ...

php 快速排序演算法,PHP兩種快速排序演算法例項

雖然在php這樣的web應用開發中,我們不是太強調排序的重要性,因為php自身已經帶了例如sort 等這樣強大的排序函式,但是在一些重要的場合,例如某些高併發的場合,我想排序演算法的影響已經不能忽略。所以在此介紹遞迴排序和迭代排序。遞迴法 遞迴法實現的快速排序 function quicksort ...

快速排序的兩種實現

快速排序演算法是現在用的最廣的排序演算法,也是效率最高的。它有兩種實現方式,一種是定軸法,另外一種是挖坑法。這裡簡單介紹一下兩種實現方法的思想,並附上c 實現 一 定軸法 1.備份對軸 首記錄 2.取兩個指標left和right,初始值分別是序列的第二個元素和最後乙個元素,並且left right ...