快速排序
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。--百度百科
用自己的话描述就是:对需要排序的数组选取一个数作为基准,然后先由尾部开始查找比基准小的数,和基准数做交换;再从数组首部开始选择一个比基准大的数,跟新的基准位置做交换
时间复杂度:O (nlogn)
稳定性:不稳定
代码实现
/*
arr 需要排序的数组
left 数组的首位
right 数组的末位
*/
func qSort(arr []int, left int, right int) {
var base = arr[left] // 默认取数组的首位作为基准数进行比较
var pointer1 = left // 左边标识位
var pointer2 = right // 右边标志位
for pointer1 < pointer2 {
for pointer1 < pointer2 && arr[pointer2] >= base {
pointer2-- // 从右边标志位开始寻找,如果一直比基准数大,则尾部指针往前移动
}
// 当前面循环终止时,说明都比基准数大,或者已经找到一个比基准数小的值
if pointer1 < pointer2 { //表示已经找到一个值比基准数小
arr[pointer1], arr[pointer2] = arr[pointer2], arr[pointer1] //交换位置
pointer1++ // 左边标志位往后移一位
}
// 对于右边也同样方式处理
for pointer1 < pointer2 && arr[pointer1] <= base {
pointer1++ // 从左边标志位开始寻找,如果一直比基准数小,则首部指针往后移动
}
if pointer1 < pointer2 { //表示已经找到一个值比基准数大的
arr[pointer1], arr[pointer2] = arr[pointer2], arr[pointer1] //交换位置
pointer2-- // 右边标志位往前移一位
}
// 至此,一次分治完成 递归处理剩下的数组
if left < pointer1 {
qSort(arr, left, pointer1-1)
}
if pointer1 < right {
qSort(arr, pointer1+1, right)
}
}
}
总结
快速排序巧妙地利用了分治的思想,将数组分成两部分,每部分或比基准值大,或比基准值小,然后再递归处理两部分数组,完成排序