快速排序原理及實現

2021-10-22 17:18:15 字數 1771 閱讀 6775

快速排序的步驟:

從陣列中選擇乙個基準數(選擇哪乙個沒有關係,為了方便一般選第乙個或者最後乙個,也可以隨機選擇)。

把小於基準數的數移動到基準數左邊,大於基準數的數移動到基準數右邊,和基準值相同的數可以放到任意一邊。此時,基準數左邊的所有值都小於右邊的任意值。

對於左右兩邊的子陣列,重複以上操作,直到陣列有序。

如果可以開闢新陣列儲存結果,用python可以很快地寫出**。但如果要求不使用額外陣列空間、在原地完成排序,應該怎麼辦呢?(面試、考試一般都要求這樣)對於第二步,歷史上曾提出過許多種方法,在現在刷題時不同的人也會使用不同的方法。

下面介紹乙個比較常見的交換法,僅僅看很難理解其中的原理,自己畫圖走一遍將會恍然大悟!

選擇陣列的第乙個元素a[0]作為pivot,設定兩個指標,i指向最左邊的元素a[0]j指向最右邊的元素a[n-1]

比較a[j]pivot,當a[j] >= pivotj指標向左移動一位,直到a[j] < pivot

a[j]填到a[i]

比較a[i]pivot,當a[i] <= pivotleft指標向右移動一位,直到a[i] > pivot

a[i]填到a[j]

不斷重複2、3、4、5步驟

i指標和j指標重合時,令a[i] = pivot,此時pivot的左邊所有元素都小於等於pivot,右邊所有元素都大於等於pivot

對於pivot左邊和右邊的元素組成的陣列,如果長度大於二,則遞迴進行1到5步。

**:

def

quicksort

(nums:

list)-

>

list

:def

sortarray

(nums:

list

, left:

int, right:

int)

->

list

: i, j = left, right

if i < j:

piviot = nums[i]

while i != j:

while nums[j]

>= piviot and j > i:

j -=

1 nums[i]

= nums[j]

while nums[i]

<= piviot and i < j:

i +=

1 nums[j]

= nums[i]

nums[i]

= piviot

sortarray(nums, left, i -1)

sortarray(nums, i +

1, right)

return sortarray(nums,0,

len(nums)-1

)

快速排序原理及C 實現

原理 快速排序,說白了就是給基準資料找其正確索引位置的過程.如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp 23 然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌 low指向起始位置,high指向末尾.首先從後半部分開始,如果掃瞄到的值大於基準資料就讓...

排序演算法 快速排序原理及Java實現

和以前的寫法對比,基準值所在的位置沒必要每次都進行交換,只在一次快排完成後,重新把當前的基準值賦值給現在的index位置就好了。寫的很強,感謝作者 public class quicksort i low j hight index a i 用子表的第乙個記錄做基準 while i j a i in...

Quick Sort 快速排序的原理及實現

原理 快速排序也是分治法思想的一種實現,他的思路是使陣列中的每個元素與基準值 pivot,通常是陣列的首個值,a 0 比較,陣列中比基準值小的放在基準值的左邊,形成左部 大的放在右邊,形成右部 接下來將左部和右部分別遞迴地執行上面的過程 選基準值,小的放在左邊,大的放在右邊。直到排序結束。步驟 1....