排序算法图解(插入、选择、冒泡、快速、合并、希尔等等)

插入排序

  1. 从左至右两两对比,右边的数比左边的小,交换,交换,不断往右移动

选择排序

  1. 选定最左边的数A,第二个数B,A和B比较,A>B则交换;B大于A,则取B后一位与A做相同的比较,不断右移遍历完,则把最小的放在了最左边。再取第二个数变为A,做同样的步骤

冒泡排序

  1. 同样是经过两两对比,比如下图,从左边开始,第1,2位数对比,大的右移,第2,3位数对比,大的右移,以此类推,知道遍历到末尾,则最大的数冒泡到最右边
  2. 再回到开头,再次按原方法对比右移,到前一次右移到末尾的前一位结束

快速排序

  1. 选择最左边的数作为基点A,位置标记为i,最右边标记为j,然后i右移,遇到比A大的停下,j向左移动,遇到比A小的停下,然后i和j对应的数交换
  2. 当i和j相遇后,i,j对应的数要和A对比,比A大,继续走,当i或j有个数比A小时,该数与A交换;然后分成两份,交换数的左边和右边各自执行同样的算法

合并排序

  1. 合并排序简而言之就是分而治之的思想
  2. 把所有数据一步步拆分,再不断的两两合并排序

希尔排序

  1. 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
    1. 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
    2. 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
  2. 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步
  3. 然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
  4. 假设有一个很小的数据在一个已按升序排好序的数组的末端。可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置

桶排序

  1. 工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)
  2. 桶排序以下列程序进行:
    1. 设置一个定量的数组当作空桶子。
    2. 寻访序列,并且把项目一个一个放到对应的桶子去。
    3. 对每个不是空的桶子进行排序。
    4. 从不是空的桶子里把项目再放回原来的序列中。

计数排序

  1. 是一种稳定的线性时间排序算法。计数排序使用一个额外的数组 {displaystyle C} C ,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。
  2. 算法的步骤如下:
    1. 找出待排序的数组中最大和最小的元素
    2. 统计数组中每个值为i的元素出现的次数,存入数组 C 的第i项
    3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
    4. 反向填充目标数组:将每个元素i放在新数组的第 C[i]项,每放一个元素就将C[i]减去1

基数排序

  1. 是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较
  2. 将所有待比较数值(正整数)统一为同样的数字长度,数字较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

堆排序

  1. 是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

最小堆

原文地址:https://www.cnblogs.com/sky-chen/p/10065038.html