• 经典排序算法--直接插入排序


    算法描述:

      插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为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可以看出,当数组中,有两元素相同时,并不替换位置,所以可以得出,直接插入排序是稳定排序。

  • 相关阅读:
    谈谈你对vuex的理解
    nodeJS中express框架设置全局跨域请求头
    C#抓取和分析网页的类
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/xsyfl/p/6869432.html
Copyright © 2020-2023  润新知