Go语言学习笔记【14】 排序算法之快速、归并排序

【声明】

非完全原创,部分内容来自于学习其他人的理论和B站视频。如果有侵权,请联系我,可以立即删除掉。

一、快速排序

1、方法和复杂度

1.1、核心思想

  • 通过一趟排序算法把所需要排序的序列的元素分割成两大块,其中,一部分的元素都要小于或等于另外一部分的序列元素
  • 然后仍根据该种方法对划分后的这两块序列的元素分别再次实行快速排序算法
  • 排序实现的整个过程可以是递归的来进行调用,最终能够实现将所需排序的无序序列元素变为一个有序的序列

1.2、主要方法

  • 先选取中枢元素,一般选择待排序区间的第一个元素。当然这里可以做优化,选择待排序区间的中位数
  • 以中枢元素为标准,小于它的元素将被放置在左边的区间,大于或等于它的元素将被放置在右边的区间
  • 依照整个思路,直到整个数组有序

1.3、稳定性

该算法不能保证相等元素的相对顺序,属于非稳定排序

举例:假如数组{5, 6, 6, 4, 3}

  • 埋坑填坑法:{ , 6, 6, 4, 3} --> {3, 6, 6, 4, } --> {3, , 6, 4, 6} ,该过程导致不稳定
  • 前后指针法:{5, 6, 6, 4, 3} --> {5, 3, 6, 4, 6},该过程导致不稳定

1.4、时间复杂度

对整个数组遍历一次的时间复杂度是 O ( N ) O(N) O(N)。而快速排序是将数组作为二叉树不断地一分为二,因此在遍历的时候,实际上相当于需要遍历的次数是二叉树的深度,其最优情况是 O ( l o g 2 N ) O(log_2N) O(log2N),最坏的情况是 O ( N ) O(N) O(N)
最优情况:时间复杂度为 O ( N ∗ l o g 2 N ) O(N * log_2N) O(Nlog2N)
最坏情况:时间复杂度为 O ( N 2 ) O(N^2) O(N2)
综合来看,时间复杂度 O ( N ∗ l o g 2 N ) O(N * log_2N) O(Nlog2N)

1.5、空间复杂度

在整个算法中,在递归过程中需要用到三个变量:记录左边元素的下标,记录右边元素的下标,记录中枢元素的值。而递归的次数是二叉树的深度,因此空间复杂度 O ( l o g 2 N ) O(log_2N) O(log2N)

2、排序的过程

快速排序的优化见:三种快速排序以及快速排序的优化

2.1、埋坑填坑法

(1)设置中枢和左右指针
1)设置退出条件:区间不成立时,即start >= end
2)将待排序区间[start, end]的第一个元素arr[start]作为中枢(挖坑),然后需要设置左右两个指针leftright进行数据查找
注意:数组最开始默认整体都是待排序区间,因此最开始时,start = 0, end = len(arr)-1
(2)数组分为左右两个区间
1)在循环中需要设置left < right。意味着循环结束后left == right
2)right指针从右往左查找,先找到第一个小于中枢元素的下标,将该元素填到左侧区间的坑里,此时右侧区间空出坑
3)然后left指针从左往右查找,找到第一个大于中枢元素的下标,将该元素填到右侧区间的坑里,此时左侧区间空出坑
4)循环2)、3),直到循环结束,左右指针重合,空出最后的坑
5)用中枢元素填最后的坑
(3)左右两个区间重复以上过程
1)左区间重复过程(1)、(2);右区间重复(1)、(2)
2)直到区间不成立

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值