排序算法之快速排序

  • 原理
    每一趟排序之后使某记录定位在其应处的位置,其余无序列以它为枢轴,分成两部分,比他小的放在它前面,比他大的放在它后面,下一趟分别对前后的子序列排序,显然可以加快速度

稳定性:不稳定
时间复杂度: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)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值