SORT简单看

幻昼 2020年03月16日 274次浏览

各种排序算法

1. 直接插入排序 (Insert Sort)

思想

  • 当插入第i (i >= 1) 个对象时, 前面的V[1], V[2], …, V[i-1]已经排好序。
  • 这时, 用V[i]的排序码与V[i-1], V[i-2], …的排序码顺序进行比较, 找到插位置即将V[i]插入, 原来位置上的对象向后顺移。

图解

insertSort

2. 折半插入排序 (Binary Insertsort)

思想

  • 设在顺序表中有一 个对象序列V[0], V[1], …, V[n-1]
  • 其中, V[0], …, V[i-1]是已经排好序的对象。
  • 在插入V[i] 时, 利用折半搜索法寻找V[i] 的插入位置。

3. 希尔排序

思想

它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
由于这个原因,希尔排序有时也叫作缩减增量排序

图解

shellSort

4. 冒泡排序 (Bubble Sort)

思想

  • 基本方法设待排序对象序列中的对象个数为n。
  • 一般地,第i趟起泡排序从1到n-i+1依次比较相邻两个记录的关键字,如果发生逆序,则交换之。
  • 其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟。
    bubbleSort

5. 快速排序 (Quick Sort)

思想

基本思想是任取待排序对象序列中的某个对象(例如取第一个对象)作为基准,按照该对象的排序码大小,将整个对象序列划分为左右两个子序列:

  • 左侧子序列中所有对象的排序码都小于或等于基准对象的排序码
  • 右侧子序列中所有对象的排序码都大于基准对象的排序码
  • 基准对象则排在这两个子序列中间(这也是该对象最终应安放的位置)。
  • 然后分别对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。
  • 基准对象也称为枢轴(或支点)记录。
    quickSort

6. 直接选择排序 (Select Sort)

思想

  • 在一组对象Vi]~VIn-1]中选择具有最小排序码的对象;
  • 若它不是这组对象中的第一个对象,则将它与这组对象中的第一个对象对调)
  • 在这组对象中剔除这个具有最小排序码的对象。在剩下的对象V[i+1]~VIn-1]中重复执行第①、②步,直到剩余对象只有一个为止。

7. 树形选择排序──锦标赛排序

思想

树形选择排序:是一种按照锦标赛的思想进行选择排序的方法.

  • 对n个纪录进行两两比较,选出较小(大)。
  • 对1中选出的较小(大)的,重复1,直到选出最小(大)的。
  • 将选出的最小(大)的输出,并将其赋为最大(小)值。
    重复1、2,直到n个纪录全部输出。

n个纪录用n个叶子结点表示,往上构成一棵完全二叉树,除叶子结点外,还要增加内部结点与根结点的辅助存贮空间n-1个

8. 堆排序( Heap sort )

思想

若在输出堆顶值之后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素中的次小值。如此反复执行,便能得到一个有序序列。

  • 建堆:用顺序结构存完全二叉树,n个元素只需n个结点
  • 筛选:输出堆顶,即堆顶与堆的最后一个元素交换;再将剩余的元素自堆顶至叶子调整成堆。
    HeapSortFirst

9. 归并排序

思想

归并将两个或两个以上的有序表合并成一个新的有序表。

两路归并 (2-way merging)
原始序列initList[]中两个有序表

  • initList[1] … initList[m]
  • initList[m+1] … initList[n]

它们可归并成一个有序表, 存于另一对象序列mergedList的 l … n 中。
merge_sort

10.链式基数排序(LSD法)

思想

用多关键字排序思想对单关键字进行排序
多关键字排序:

  • 依主,次,次次关键字,…,排序

单关键字排序:

  • 按位把单关键字K看成由多个子关键字组成:
    K=K1K2…Kd

各种排比较

compare