- 原理
每一趟排序之后使某记录定位在其应处的位置,其余无序列以它为枢轴,分成两部分,比他小的放在它前面,比他大的放在它后面,下一趟分别对前后的子序列排序,显然可以加快速度
稳定性:不稳定
时间复杂度: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) } }