排序算法の快速排序原理&代码&优化

排序算法系列第三篇,快速排序,快速排序是最常用的排序算法之一,采用了递归迭代的思想,能大大提高排序效率。

平均时间复杂度

最好情况

最坏情况

空间复杂度

稳定性

排序方式

快速排序

O(nlogn)

O(nlogn)

O(n2)

O(nlogn)

不稳定

In-Place


基本思想:首先对无序的记录序列进行“一次划分”,通过一趟排序将待排序列分为两部分,使得其中一部分记录的关键字均比另一部分小,再分别对这两部分排序,以达到整个序列有序。

一句话概括就是,“分而治之”!

 其实,有点诸侯国那味儿,天子作为原始代排列数组,将原始内容按照中心轴为基准,分配给诸侯,各个诸侯只要排好序,那整体就有序了,同样诸侯再往下分,最后到平民,最苦的还是基层老百姓,统治阶级大手一挥坐享其成就完事了

代码,以R为例

quicksort <- function(array,start,end){
  left=start
  right=end
  if(left>=right){
    return(array)
  }
  else{
    #一般选取第一个元素为中心轴元素
    markvalue=array[left]
    while(left<right){
      while(left<right&&array[right]>markvalue){
        right=right-1
      }
      array[left]=array[right]
      while (left<right&&array[left]<=markvalue) {
        left=left+1
      }
      array[right]=array[left]
    }
    print(array)
  }
  array[left]=markvalue
  array=quicksort(array,start,left-1)
  array=quicksort(array,right+1,end)
  return(array)
}

代码示意图如下:

 优化,单循环

选定基准元素,同时设置一个mark指针指向数列起始位置

从基准元素的下一位开始遍历

如果遍历到的元素大于基准,继续向后

如果遍历到的元素小于基准,指针右移1位,遍历元素和指针元素互换

重复上述操作

递归子序列

代码,以R为例

single_quickSort=function(array){
    n=length(array)
    mark=array[1]
    exchange=1,record=2
    for(i in 1:n){
        if(array[i]>mark){
            exchange=i
            record=i+1
            break
        }
    }
    if(exchange!=1&&exchange!=n){
        for(i in record:n){
            if(array[i]<=mark){
                temp=array[i]
                array[i]=array[exchange]
                array[exchange]=temp
                exchange++
        }
    }
    array[i]=array[exchange-1]
    array[exchange-1]=mark
    }
    if(exchange==1){
    array[1]=array[i]
    array[i]=mark
    }
    if((exchange-2)>=2){
    array[1:(exchange-2)=single_quickSort(array[1:(exchange-2}])
    }
    if((n-exchange+1)>=2){
    array[exchange:n]=single_quickSort(array[exchange:n])
    }
    return(array)
   }

优化后代码示意图如下:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值