数据结构-算法-排序-常用排序方法简介

声明:此文章仅供学习排序方法的原理,不附加代码

 

一。常用排序方法

1. 冒泡排序(Bubble Sort)
2. 直接选择排序(Straight Selection Sort)
3. 直接插入排序(Straight Insertion Sort)
4. 希尔排序(Shells Sort)
5. 堆排序(Heap Sort)
6. 快速排序(Quick Sort)
7. 归并排序(Merge Sort)
8. 桶排序(Bucket Sort)/基数排序(Radix Sort)

二。简介实现方法(皆以从小到大排列为例,设在正整数的情况下,如有其他情况请对比考虑)   注:附图皆为百度所得,感谢图主分享。

1.冒泡排序,冒泡排序作为初学程序的第一种排序方法,其方法是对序列中所有数实行前后元素对比,小的在前大的在后,这样从头到尾进行n-1次

2.直接选择排序,又叫简单选择排序,其方法是将序列中最小的元素比较出来放到序列头部,然后剩下的元素按此方法继续比较选择。白话说,就是直接选择出最小的挨个放

3.直接插入排序,其方法是将序列11111111(1代表元素,不代表数值)看作两部分暂且用a来隔离这两部分,即1a1111111,a前为已经排好位置的元素,a后为未排好位置的元素,然后依次取出a后的元素与a前比较,放在合适的位置,即初始1a111111,第一次排序完之后为11a11111。白话说,就是挨个来找位置插入

4.希尔排序,又叫做缩小增量排序,是直接插入排序的基础上进行的改进。方法是取间隔a的数进行比较,这个a称为增量,若前数大于后数,则将其交换位置,从头到尾全部比较完成后,再按照间隔a/2进行比较,若a是奇数,则按照 (a+1)/2的间隔计算,直至当增量a=1时,比较完a=1这一趟,便结束排序。附图为比较过程:

                   è¿éåå¾çæè¿°

5.快速排序,在冒泡法的基础上进行的改进,序列arr,标记头尾为i ,j,设标记量temp = arr[i] 也就是arr[0]

j开始 --,直到有arr[j]<temp,此时j找到位置了,站在此处不动,i开始动

i开始++,直到有arr[i]>temp,此时i找到位置了,站在此处不动,j再开始动

直到j与i相遇了,哎此时相遇位置的数与temp进行交换

第一次排序结束,相遇位置左侧元素便均小于temp,右方均大于temp

利用这种方法对两侧进行递归操作,直到temp实在无法拆分左右停止,次数的序列便排序完成。

附图第一次排序心路历程。

               temp在此,谁敢放肆!                 

        

     

           

         

             

 

6.归并排序,采用”分治策略“,灵感来自归并操作。首先理解什么是归并操作??

归并操作是指两个有序列表,合成一个有序表。

设俩表为:    abcdefg     ABCDEFG

取两个列表得第一个元素比较,谁小谁放在合并表首位,后续元素依次前进,即第一次归并得 :(设a<A)

bcdefg   ABCDEFG,       合并表为 a

继续重复此操作,若有一方为空了,则将另一方元素直接跟随在合并表表尾  (设此时剩下efg)

此时: efg      null            合并表为   abABCDEcdFG,故: abABCDEcdFG +efg  = abABCDEcdFGefg 

好,理解了归并操作,来讲解什么是归并排序。

分治,也可以叫分合

(1)分,将序列分解

                

(2)治,合,将分解后得小模块进行归并操作

                例如:8  4 进行归并操作得到合并序列  4 8

                            4 8           5 7序列进行归并操作得到合并序列4 5 7 8

               

注:https://www.cnblogs.com/crystalmoore/p/5930841.html  这位博主有个动态演示,可以进去看一下

7.堆排序,堆排序是基于堆的概念上设计的排序算法

   堆,一般常用的也就是二叉堆,二叉堆的可以形象的比喻成一颗 完全二叉树。(对于堆与二叉树在此不多解释,需要的同学们请自行百度学习)。而二叉堆中分为大顶堆和小顶堆。

   大顶堆是节点处的值大于等于左右孩子,小顶堆是节点处的值小于等于左右孩子。附图:   左大右小

     

    一般升序采用大顶堆,降序采用小顶堆

    将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

    说白了,先将序列看作是一个完全二叉树,从最后一个非叶子节点开始,

    (1)将结点及其叶子,进行比较,把最大的换到结点处,这样一层层的把最大的节点拱到了堆顶

    (2)将堆顶元素跟末尾元素进行交换,这样就将最大值放到了序列最后

    (3)此时将剩余数看作完全二叉树进行如此计算,一步一步的将最大值拱出来,剩下一个节点无左右孩子的时候,排序完成。

   参考:https://www.cnblogs.com/chengxiao/p/6129630.html

8.桶排序,又称桶排序

其方法主要是:

(1)从序列中找出最大值N,设置一个数组arr,并使其所有值为0,长度为N+1,其数组下标0--N也就代表了这N+1个桶

(2)将所有数据放入他所匹配的下标桶,并在放入时使得此处arr得值加1表示计数

(3)根据桶的下标取出所存在的元素,若某个桶得值为0,则直接跳过,通过桶得下标排序,通过桶的值判断有多少元素在这个桶里存放

(4)排序结束,出现结果

三。所有常用排序之间得比较(图来自百度,感谢图主无私分享)

      

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值