- 原理
每一趟排序之后使某记录定位在其应处的位置,其余无序列以它为枢轴,分成两部分,比他小的放在它前面,比他大的放在它后面,下一趟分别对前后的子序列排序,显然可以加快速度
稳定性:不稳定
时间复杂度:O(n*logn/log2)
空间复杂度:O(logn/log2)
- 步骤
1:从数列中挑出一个元素,称为 “基准”(pivot)
2:重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
- 实现(递归)
//golang
/*寻找一次划分*/
func partional(arr []int, start, end int) int {
low := start
high := end
tmp := arr[low]
for low < high {
for low < high && arr[high] >= tmp {
high--
}
if low == high {
break
} else {
arr[low] = arr[high]
}
for low < high && arr[low] <= tmp {
low++
}
if low == high {
break
} else {
arr[high] = arr[low]
}
}
arr[low] = tmp
return low
}
func quikSort(arr []int, start, end int) {
par := partional(arr, start, end)
if par > start+1 {
quikSort(arr, start, par-1)
}
if par < end-1 {
quikSort(arr, par+1, end)
}
}