数据结构 排序

冒泡排序(bubble):前后比较,前比后大交换-时间复制度O(N^2)嵌套循环

插入排序(insert):插入的思想,从第二个数据开始插入重新插,找到在现有数据结构中应存在的位置插入到数据中。时间复制度O(N^2)最理想为O(N)需要进行一定的判断以跳出循环。

选择排序(select):选择最大或最小值,与头或尾部数据进行交换,每次交换后开始选择位置改变除去刚交换的数据。

堆排序:先建立大堆或者小堆,当建立小堆时根结点为最小值,将根结点与最后一个结点交换总结点数减一,将根结点向下移动(逆序)。大堆则反之正序。

希尔排序(shell):在插入排序前进行预排序,预排序:将中间相隔多个(随意值)数据的连续数据分成一组如:第1,3,5,7个数据为一组第2,4,6,8个数据为一组进行预排序,作用:将很大或很小的数经过较少次的交换移动到前或后。当预排序完进行整体的插入排序。多次预排序,设跳过数据个数为N先将N定位总数据个数进行循环没次循环N除2(随意值)直到N为1完成整体排序。除数大于二最后需要加一保证最后一次一定是整体插入排序。时间复制度O(N^1.3)。

快速排序(quicksort):霍尔(hoare)在1962年发布。二叉树结构排序。单趟:定义一个数一般为最左值,从最左的下一个数据开始找,一个从最右开始找,最左找大,最右找小,将比最左值小的数放左边,比最左值大的数放右边,当相遇时交换最左值和相遇点值此时本来最左值的位置就是正确的位置。为什么相遇点值一定比最左值小:

问题:

1.相遇判断容易两个相错位相遇点不停。所以再移动判断时需要加上相遇退出循环条件。

2.递归返回判断条件当分治的区间不存在时可能出现左在右的右边。

3.死循环,若两边都有与最左值相同的数判断左右移动的条件不对容易进入死循环,此时可以将等于最左值也纳入移动条件,与最左值相等的数在哪边都可以,若没有此条件两边不进入移动分支两边都不会移动会变成死循环。

4.开始条件:若开始条件左为最左值的下一个数据在有序的情况下会出错,此时已经有序了但是我们从第二个数据开始当右值与左值相遇时是在整体第二个数据(因为已经有序右值都比左值大),这时我们退出循环再交换最左值和相遇点值后反而变成无序。

5.先走左边还是右边:最后相遇点的不同,若我们先走的左边这时因为刚交换完右值是大于最左值得到数,左边开始走若已经排好序的相遇点就是右值所在位置,所以这时的相遇点是大于最左值的当我们退出循环与最左值交换则打乱了序列,这时应该右值先走。除非我们的对比值是最右值。

6.栈溢出问题:三数取中在debug版本下由于运行程序会添加许多的调试信息,数组有序的情况下递归层数太多可能存在栈溢出的风险。

霍尔版快排在理想情况下每次的最左值都是中间值每次都二分的时间复制度是O(n*logn),当数组是有序的时候,每次的最左值都是最小值时间复杂度为O(N^2).解决方案:三数取中或着直接随意选择一个值将此值与最左值交换再开始快排。

局部优化:递归最后一层占递归总数的50%,倒数第二层占25%,我们可以优化掉最后几层的递归,当子节点区间的数据少于一定量时直接使用插入排序优化递归层数。

快速排序挖坑法:正常的快速排序判断条件比较难确定所以改良了一个较为简单一点的快排。将第一个数定义为比较值定义一个临时变量存储比较值,这时的第一个坑位就是第一个位置,从右边开始找小找到后填入坑位第一个位置,在移动左边找大(这时右边就是坑位),找到后填入右边的坑位,移动右边找小循环当左右相遇退出循环将临时变量的值赋给相遇位置,进入递归。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值