zoukankan      html  css  js  c++  java
  • 排序-快速排序

    快速排序

    基本知识

    稳定性:不稳定
    存储方式:内部排序
    空间复杂度:O(logn)
    最坏时间复杂度:O(n2)
    最好时间复杂度:O(n logn)
    平均时间复杂度:O(n logn)

    基本思想

    快速排序使用分治法策略来把一个串行分为两个子串行
    快速排序又是一种分而治之思想在排序算法上的典型应用
    本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法

    单指针算法排序步骤

    1. 首先将数组首元素设置为基准元素,第二个元素的位置设为交换位置
    2. 使用一个单向的指针来对数组进行遍历
    3. 第二个开始的元素依次与基准元素比较,如果大于基准元素则跳过,如果小于基准元素,则将其与前面较大的元素进行交换,交换之后交换位置+1
    4. 将数组中所有小于基准元素的元素交换完毕后,再将基准元素与最后一个小于基准元素的元素交换位置,将基准元素放到中间位置
    5. 以基准元素为分割线,递归地把小于基准值元素的子数列和大于基准值元素的子数列排序

    双指针算法排序步骤

    1. 从数列中挑出一个元素,称为 "基准"
    2. 右指针先从右边最后一个元素开始向左遍历寻找小于基准元素的元素,找到之后然后停下来(从右指针开始是为了保证两指针相遇时元素是小于基准元素的)
    3. 左指针从左边第二个元素开始向右遍历寻找大于基准元素的元素,并判断是否和右指针相遇
      没有相遇:在相遇之前找到比基准元素大的元素,则交换左指针和右指针的元素位置,然后右指针继续向左寻找
      相遇:相遇时,交换基准元素和相遇元素的位置,将基准元素放到中间位置
    4. 以基准元素为分割线,递归地把小于基准值元素的子数列和大于基准值元素的子数列排序

    双指针(挖坑)算法排序步骤

    1. 从数列中挑出一个元素,称为 "基准"
    2. 用临时变量将首元素存下来,首元素就变为了一个坑
    3. 右指针先从右边最后一个元素开始向左遍历寻找小于基准元素的元素,找到之后把值赋给首元素的位置(坑位),现在该元素原来的位置又变成了坑位(从右指针开始是因为第一个坑位是首元素在左边,所以需要找到右边的小于它的元素和它交换坑位。如果以尾元素为基准元素,那么就应该从左边开始遍历大于基准元素的元素)
    4. 左指针从左边第二个元素开始向右遍历寻找大于基准元素的元素,并判断是否和右指针相遇
      没有相遇:在相遇之前找到比基准元素大的元素,把值赋给坑位,然后该元素原来的位置变成了坑位
      相遇:相遇时,交换基准元素和相遇元素的位置,将基准元素放到中间位置
    5. 以基准元素为分割线,递归地把小于基准值元素的子数列和大于基准值元素的子数列排序

    总结:

    快速排序是写到目前位置,比较复杂的一个了,代码看了很多别人的,实现方法都不尽相同,等我学有所成(有时间)再来贴代码图
  • 相关阅读:
    terminator shortcut
    支付宝集成错误
    null与DBNULL
    linode接连出问题,我也没看懂英文
    ruby 日期 好函数
    ruby datetime
    act as tree插件
    ruby 时间
    ruby规则引擎
    on ,type等关键词,使用
  • 原文地址:https://www.cnblogs.com/yanghanwen/p/12113333.html
Copyright © 2011-2022 走看看