zoukankan      html  css  js  c++  java
  • 经典排序算法--直接插入排序

    算法描述:

      插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。

    白话理解:

      很多排序方法,都可以用我们小时候上学排队的方式来解释。插入排序,想一下以前在上课的时候,老师在给我们排队时,有没有这样的举动,让你和在你前面的同学,比身高,如果你比前面的同学矮的话,前面的同学就站到你的位置,然后你在和你现在前面的同学进行身高比较,如果你还是比较矮的话,前面的同学则换到你的位置。直到你比前面同学高为止,将你插入前面同学后面。

      假设老师从第二个同学开始调整位置,然后一直调整到最后一位,那么这种排序的方法就叫做插入排序。

    下面以五个无序数据为例:

      3,1,5,4,2

    第一次排序,1比3小,则1和3换位置,变为了1,3,5,4,2

    第二次排序,5比3大,不需要调整,仍未1,3,5,4,2

    第三次排序,4比5小,则4和5 换位置,此时4比3大,则不再继续调整,此时变为了1,3,4,5,2

    第四次排序,2比5小,2和5换位置,2又比4小,2继续和4换位置,2仍然比3小,继续和3换位置,最后2比1大,不再调整。最终,变成了1,2,3,4,5.

    数据变成了有序。

    Java代码实现

     1 package sortDemo;
     2 
     3 /**
     4  * 插入代码实现
     5  * @author xianyu
     6  * @CreatTime 下午8:16:11
     7  */
     8 public class InsertDemo {
     9     
    10     public static void main(String[] args) {
    11         int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
    12         System.out.println("排序前:");
    13         print(sort);
    14         insertSort(sort);
    15         System.out.println("
    排序后:");
    16         print(sort);
    17     }
    18     
    19     
    20     /**
    21      * 直接插入算法排序
    22      * @param a
    23      */
    24     public static void insertSort(int[] a){
    25         //从下标为1开始比较,知道数组的末尾
    26         for (int i = 1; i < a.length; i++) {
    27             int j;
    28             //将要比较的元素,拿出待比较过后再插入数组
    29             int tmp = a[i];
    30             //一次与前一元素比较,如果前一元素比要插入的元素大,则互换位置
    31             for (j = i-1; j >=0&&a[j]>tmp; j--) {
    32                 a[j+1] = a[j];
    33             }
    34             //将比较的元素插入
    35             a[j+1] = tmp;
    36         }
    37     }
    38     
    39     public static void print(int[] a){
    40         for (int i = 0; i < a.length; i++) {
    41             System.out.print(a[i]+" ");
    42         }
    43     }
    44 }

    分析复杂度

     ①插入排序的时间复杂度 就是判断比较次数有多少,而比较次数与 待排数组的初始顺序有关,当待排数组有序时,没有移动操作(第31行for不成立),此时复杂度为O(N),当待排数组是逆序时,比较次数达到最大--对于下标 i 处的元素,需要比较 i-1 次。总的比较次数:1+2+...+N-1 ,故时间复杂度为O(N^2)

    ①可以看出,算法中只用到了一个临时变量(第29行),故空间复杂度为O(1).

    由第31行循环条件,a[j]>tmp可以看出,当数组中,有两元素相同时,并不替换位置,所以可以得出,直接插入排序是稳定排序。

  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/xsyfl/p/6869432.html
Copyright © 2011-2022 走看看