数据结构_排序(直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序)

本文只讲思想,无代码实现

一、直接插入排序

思想:

  • 给定一组数,将其分为有序区和无序区
  • 初始状态,有序区为这组数中的第一个数,无序区为剩下数
  • 排序时,将无序区的第一个数与有序区的数进行比较,然后插入到合适的位置
  • 重复上一步骤直到无序区没有数

举例:
12 ,15 ,9 ,20 ,6 ,31,24 (以下【】内为有序区)
初始状态【12】 ,15 ,9 ,20 ,6 ,31 ,24
第一次排序:【12,15】,9,20,6,31,24(将无序区的15与有序区的12进行比较)
第二次排序:【9,12,15】,20,6,31,24(将无序区的9与有序区的12和15比较)
第三次排序:【9,12,15,20】,6,31,24
第四次排序:【6,9,12,15,20】,31,24
第五次排序:【6,9,12,15,20,31】,24
第六次排序:【6,9,12,15,20,24,31】

二、希尔排序(不稳定)

首先区分基本有序局部有序的概念
基本有序可以理解为一组数除个别数顺序不符合外,基本符合正序或逆序
局部有序可以理解为一组数有多组有序的数组成
举例:基本有序,{1,2,8,4,5,6,7,3,9}局部有序{6,7,8,9,1,2,3,4,5}

思想:

  • 一组含有n个数的序列,一般取间隔d=n/2(向下取整),按照d将这组数分为d组子序列
  • 对这d组子序列依次进行比较(将这组数构造成一个基本有序的序列)
  • 对d按照初始方法继续分割,将这组数按减小后的间隔再分为d组子序列
  • 继续比较,直到d=1

举例:
{59,20,17,36,98,14,23,83,13,28}共10个数,取d=10/2=5
将此序列分为5组子序列(59和14,20和23,17和83,36和13,98和28)
在这里插入图片描述
然后将这五组序列,每组中的两个数进行直接插入排列,结果如下图
在这里插入图片描述
然后将d减小d=5/2向下取整=2进行分组如上图,分为两组序列(14、17、28、23、36为一组,20、13、59、83、98为一组)。这两组每组中的五个数进行直接插入排列
在这里插入图片描述
继续缩小d=1分组如上图,也就是说此时整组数被分为一组,对这组数进行直接插入排序
即如上边所介绍的排序开始,最终结果如下
在这里插入图片描述

三、起泡排序

思想:

  • 给定一组数,两两进行比较,如按从小到大顺序,如果下标小的数大于下标大的数则这两个数进行交换,按从大到小排序,下标小的数小于下标大的数则交换。

举例:
{50,13,55,97,27,38,49,65}按从小到大顺序排
第一次排序:
50和13比,交换
{13,50,55,97,27,38,49,65}
50和55比,不用交换
55和97比,不用交换
97和27比,交换
{13,50,55,27,97,38,49,65}
97和38比,交换
{13,50,55,27,38,97,49,65}
97和49比,交换
{13,50,55,27,38,49,97,65}
97个65比,交换
{13,50,55,27,38,49,65}97
第一次结束,将最大的数97排到了最右边,第二次排从剩下的数中进行排
第二次排序
{13,50,55,27,38,49,65}
13和50比,不用交换
50和55比,不用交换
55和27比,交换
{13,50,27,55,38,49,65}
55和38比,交换
{13,50,27,38,55,49,65}
55和19比,交换
{13,50,27,38,49,55,65}
55和65比,不用交换
最后将65提取出来,下一趟排序在{13,50,27,38,49,55}中排
一词类推,最终每次排序将所排序列中最大的选出来,直到最后只剩一个数也就是整个数中最小的那一个

四、快速排序

思想:

  • 给定一组数中,选择一个轴值(这里讲解选取第一个数为轴值)
  • 然后在这组数的首尾均设置两个参数指向要与轴值进行比较的数
  • 将轴值的左右分为两组数,左边的数均小于轴值,右边的数均大于轴值
  • 排序一次后再对轴值两边的数进行上述排序方法,直到每个分区只剩一个数

举例:

{23,13,49,6,31,19,28}设置轴值为23(加粗),并设置i和j分别指向左右要与轴值进行比较的数
在这里插入图片描述
①i指向23,j指向28,23<28不交换
②j前移指向19,23>19,交换位置,i右移,j所指的位置不变
③13<23不交换,i右移
④49>23,交换位置,j左移
⑤23<31不交换,j左移
⑥23>6,交换,i右移,此时i和j均指向23即轴值,第一次排序结束
第二次对23左右两边进行上述同样方法排序
在这里插入图片描述
最终排好结果如上图

五、简单选择排序

思想:

  • 将一组数分为有序区和无序区,初始有序区没有数,无序区包含整组数
  • 然后在无序区中挑出最小数与无序区中的第一个数进行交换,并将其加入有序区
  • 重复上一步骤直至无序区只剩一个数

举例:
{49,18,65,97,76,13,38}【】内为有序区
初始【】49,18,65,97,76,13,38
第一次【13】49,18,65,97,76,38
第二次【13,18】49,65,97,76,38
第三次【13,18,38】49,65,97,76
第四次【13,18,38,49】65,97,76
第五次【13,18,38,49,65】97,76
第六次【13,18,38,49,65,76】97

六、堆排序

首先明确的概念
堆是指一个完全二叉树,每个结点小于等于其孩子结点(小根堆)或大于等于其孩子结点(大根堆)

对于一个不是堆的完全二叉树,构造堆的方法为,从最后一个分支结点开始进行筛选。具体可参考此博文堆排序及其分析

猜你喜欢

转载自blog.csdn.net/BeatRex/article/details/85804120