选择排序、插入排序、希尔排序总结

╰+哭是因爲堅強的太久メ 2022-09-28 11:57 267阅读 0赞

本来昨天想写最小生成树的kruskal算法,但是其中需要将图的边集数组进行排序,要用到排序算法,所以暂时先将kruskal算法放一下,把排序算法好好复习和总结一遍

以下的排序结果默认为非递减

1、选择排序

选择排序的思想:从第i个元素开始(i=1,i++),遍历一遍数组,找出数组中的最小值,然后与第i个元素交换位置,i++,不断的循环下去直到i>数组长度(长度为length-1,第0个元素习惯用作哨兵位)

看看具体算法

  1. public void selectSort(int arc[]){
  2. int min;
  3. for(int j=1;j<arc.length;j++){
  4. min = j;
  5. for(int i=j+1;i<arc.length;i++){
  6. if(arc[i]<arc[min])
  7. min = i;
  8. }
  9. each(arc,j,min); //交换arc[j]和arc[min]的位置
  10. System.out.println(arc[j]);
  11. }
  12. }

选择排序的几个特点:

1.时间复杂度为O(n^2)

2.运行的时间与输入参数的初始状态无关,因为每一次的遍历都不会为下一次提供任何有用的信息;

3.数据的移动是最少的。

2、插入排序

插入排序的思想:将第i个元素与i-1的元素比较,如果第i个元素较小,则把其插入到arc[0]的哨兵位,然后比哨兵位大的元素不断的往后移动一位,最后将哨兵位的元素插入到最后移动的那个位置。注:i一般从2开始,因为假设第1位已经排好序了。

看看具体算法

  1. public void insertSort(int arc[]){
  2. int i;
  3. for(int j=2;j<arc.length;j++){
  4. if(arc[j]<arc[j-1]){
  5. arc[0] = arc[j]; //插入哨兵位
  6. for(i=j-1;arc[i]>arc[0];i--){
  7. arc[i+1] = arc[i]; //元素不断向后移动一位
  8. }
  9. arc[i+1] = arc[0]; //将哨兵位的元素插入到最后一次移动的位置
  10. }
  11. }
  12. output(arc); //输出排好序的数组元素
  13. }

output(int arc[])具体代码

  1. private void output(int[] arc) {
  2. for(int i=1;i<arc.length;i++){
  3. System.out.println(arc[i]);
  4. }
  5. }

插入排序的几个特点:

1.时间复杂度为O(n^2),但插入排序平均速度要比选择排序快;

2.运行时间与输入的参数初始化状态有关,比如对于部分有序的数组十分高效;

3、希尔排序

希尔排序思想:希尔排序是简单的改进了插入排序,交换不相邻的元素以进行局部的排序,并最终用插入排序对局部的数组排序。

看看具体代码

  1. public void shellSort(int arc[]){
  2. int i;
  3. int increment = arc.length/3+1; //增量序列
  4. while(increment>0){
  5. for(int j=1+increment;j<arc.length;j++){
  6. if(arc[j]<arc[j-increment]){
  7. arc[0] = arc[j];
  8. for(i=j-increment;i>0&&arc[i]>arc[0];i-=increment){//i>0是表示当要插到第1位时的条件,且i>0一定要在逻辑运算中的前面
  9. arc[i+increment] = arc[i]; //否则会ArrayIndexOutOfBoundsException
  10. }
  11. arc[i+increment] = arc[0];
  12. }
  13. }
  14. increment/=3;
  15. }
  16. output(arc); //输出排好序的数组元素
  17. }

希尔排序的几个特点:

1.时间复杂度为O(n^3/2)

2.对于较大的数组,希尔排序的速度相较于插入排序的优势更加明显

总结

虽然选择排序和插入排序的时间复杂度一样,但是选择排序的运行时间和参数的初始状态无关,只要数组参数的长度一样,不管数组里面的元素初始排序是怎样的,运行时间都不会有改变(默认理想环境,忽略硬件环境造成的误差)。而插入排序的运行时间和参数初始状态有关,特别是对于部分有序数组,十分高效,因此插入排序比选择排序的平均运行时间要快一些。

希尔排序是对插入排序的改进,对距离increment的元素进行比较和交换,元素的跳跃跨度较大,使得希尔排序在较大的数组中的运行时间要比插入排序短。

发表评论

表情:
评论列表 (有 0 条评论,267人围观)

还没有评论,来说两句吧...

相关阅读

    相关 插入排序——排序

    / 算法思想: 先将整个待排序元素序列分割成若干子序列,对每个子序列分别进行直接插入排序。 当整个待排序元素序列“基本有序”时,再