快速排序演算法的正確性的必要條件
取第乙個元素或最後乙個元素(最壞情況:陣列已經排好序)
取首個元素、中間元素、最後乙個元素的中位數(三數取中,不是平均數!!)
隨機取乙個元素
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 不可控制展示位置,此方式跳轉錨點後,錨點元素的頂部與瀏覽器視窗頂部是齊平的 ...