快速排序注意事項 兩種partition的方式

2021-09-22 08:28:21 字數 1134 閱讀 5639

快速排序演算法的正確性的必要條件

取第乙個元素或最後乙個元素(最壞情況:陣列已經排好序)

取首個元素、中間元素、最後乙個元素的中位數(三數取中,不是平均數!!)

隨機取乙個元素

lomuto scheme

private

intpartition

(int

array,

int left,

int right,

int pivotindex)

}// remember our pivot is the last element, swap it to its final position.

swap

(array, divideindex, right)

;// return the final position of our pivot, which is the partition position

return divideindex;

}

hoare scheme

測試發現陣列隨機時後者比前者慢一丁點,但相同元素陣列,前者會棧溢位,後者很快

所有元素相等時不會有問題(看**)

最壞情況(可能stackoverflow)

private

intpartition

(int

array,

int left,

int right,

int pivotindex)

while

(array[j]

> pivotvalue)

// array[left, i) <= pivotvalue and array(j, right] >= pivotvalue

// array[i] >= pivotvalue and array[j] <= pivotvalue

if(i >= j)

swap

(array, i, j)

; i++

; j--;}

}

注:連續子區間指的是[left, p], [p+1, right],不連續子區間指的是[left, p-1], [p+1,right]

快速排序的注意事項

templatevoid quick sort iter begin,iter end iter swap begin,e quick sort begin,e quick sort e 1,end 第一,等於的時候進不進行交換。需要進行交換,理由就是盡量使得被target被交換到陣列的 問題就出現...

兩種快速排序

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

實現錨點跳轉的兩種方式及注意事項

1 設定錨點 新增錨點id demoanchor 2 設定錨點跳轉點選鏈結 demoanchor 點我跳轉 缺點 1 此方式跳轉後會替換路由裡 後面的部分。用hash路由的請避免使用此方式,用history路由的可使用 2 不可控制展示位置,此方式跳轉錨點後,錨點元素的頂部與瀏覽器視窗頂部是齊平的 ...