排序

发布时间:2020-05-30 04:25:23 | 作者:神秘网友 | 本教程技术重点:排序 排序 选择 算法 描述 首先 找到 数组 中最 小的

排序

1选择排序

算法描述:

首先,找到数组中最小的元素,将它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与第二个元素交换位置。如此重复,不断地筛选出剩余元素中最小的进行排序,直到将整个数组排序。

特点:

  • 运行时间和输入无关。为了筛选出最小的元素而扫描一遍数组并不能为下一遍扫描提供信息。一个有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用排序时间一样。
  • 数据移动很少。交换次数和数组的大小是线性关系。其他算法基本上增长数量级都是线性对数或是平方级。

2插入排序

算法描述:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

插入排序动图演示:

排序

特点:

  • 需要的交换操作和数组中的倒置的数量相同。321(三对倒置):312、132、123
  • 适用于倒置数量较少的部分有序数组

3希尔排序(缩小增量排序)

算法描述:

  • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列个数k,对序列进行k 趟排序;
  • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序视频演示

特点:

      增量为1时即为插入排序。

4归并排序

算法描述:

     将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。

归并排序视频演示

特点:

  • 归并排序可以保证将任意长度为N的数组排序所需时间和NlogN成正比。
  • 主要缺点是它所需的额外空间和N成正比。

    归并排序又可细分为自顶向下的归并排序和自底向上的归并排序。

5快速排序   

算法描述:

  • 从数列中挑出一个元素,称为 “基准”;
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
  • 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。  

特点:

  •    快排与归并都采用了分治的思想,较大的不同是在归并排序中,一个数组被等分;在快速排序中,切分位置随机。
  •    可能是应用最广泛的排序算法
  •    是原地排序,且将长度为N的数组排序所需的时间和NlogN成正比。

   注:原地算法(in-place algorithm)基本上不需要 额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法。当算法运行时,输入的数据通常会被要输出的部分覆盖掉。——Wiki。

6堆排序

算法描述:

  • 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

      大顶堆排序:

      排序

    小顶堆排序

特点:

    无序数组实现的基于二叉堆的优先队列即为堆排序。主要有两个阶段,构造一个有序堆;下沉排序,递减顺序取出所有元素即得到排序结果。

部分内容引自:十大经典排序