• 直接插入排序


    1.原理

    直接插入排序原理和插牌方法类似,它将数组看作有序元素和无序元素组成的数组,把无序的元素插入到有序的数组中。
    已知待排序数组a=[4,2,1,3].

    综述:2为待插入数,4>2,变为[2,4,1,3];  1为待插入数,4>1和2,变为[1,2,4,3];  3为待插入数,4>3,3>1和2,变为[1,2,3,4].         

    第一次排序:
    有序元素:[4],待插数:2
    抓到2,因为4>2,将4后移,即a[1]=4;
    [4,4]
    再将2插到a[0]中,即a[0]=2;
    [2,4]
    第二次排序:
    有序元素:[2,4],待插数:1
    抓到1,因为4>1,将4后移,即a[2]=4;
    [2,4,4]
    因为2>1,将2后移,即a[1]=2;
    [2,2,4]
    再将1插入到a[0]中,即a[0]=1;
    [1,2,4]
    第三次排序:
    有序元素:[1,2,4],待插数:3
    抓到3,因为4>3,将4后移,即a[3]=4;
    [1,2,4,4]
    因为2<3,无需将剩余有序数组元素和3比较,将3插入到a[2],即a[2]=3;
    [1,2,3,4]

    2.时间复杂度

    最好情况:序列是升序排列,在这种情况下,需要进行的比较操作为(n-1)次,交换操作为0次,即O(n)。

    最坏情况:序列是降序排列,那么此时需要比较n(n-1)/2次,交换操作(n+2)(n-1)/2次,即O(n^2)。

    注:例如654321,需要将它排为654321,则只需要比较5次;当将它排为123456时,就要比较1+2+3+4+5次,移位2+3+4+5+6次。

    3.代码实现

     1 public class InsertSortTest {   
     2          //遍历数组
     3     public static void cc(int a[]){
     4         for(int i=0;i<a.length;i++){
     5             System.out.print(a[i]+" ");
     6         }
     7         System.out.println();
     8     }
     9     public static void Test(int a[]) {
    10         for (int i = 1; i < a.length; i++) {          //从第二个数开始
    11             int temp = a[i];                //设置待插入数
    12             int j = i - 1;
    13             while (j >= 0 && a[j] > temp) {               //将待插入的数和前面的有序数组元素进行比较
    14                 a[j + 1] = a[j];                            //如果前面的有序数组元素大于待插入数,则将有序数组元素后移
    15                 InsertSortTest.cc(a);
    16                 j--;
    17             }
    18             a[j + 1] = temp;                 //如果某有序数组元素小于待插入数,终止后移,并且在该元素后插入待插入数
    19             InsertSortTest.cc(a);
    20         }
    21     }   
    22     public static void Test1(int a[]) {
    23         for (int i = 1; i < a.length; i++) {
    24             int temp = a[i];
    25             while (i >= 1 && a[i-1] > temp) {
    26                 a[i ] = a[i-1];
    27                 i--;
    28             }
    29             a[i] = temp;
    30         }
    31     }    
    32     public static void Test2(int a[]) {
    33         for (int i = 1; i < a.length; i++) {
    34             int temp = a[i];
    35             int j=i-1;
    36             for(;j>=0;j--){
    37                 if(a[j] > temp){
    38                 a[j + 1] = a[j];
    39                 InsertSortTest.cc(a);
    40                 }
    41                 else{
    42                     break;
    43                 }
    44             }
    45             a[j+1] = temp;    
    46             InsertSortTest.cc(a);
    47         }
    48     }  
    49     public static void main(String[] args) {
    50         int a[]={4,2,1,3};
    51         InsertSortTest.Test(a);
    52     }
    53 }

  • 相关阅读:
    自习任我行第二阶段个人总结9
    自习任我行第二阶段个人总结8
    自习任我行第二阶段个人总结7
    自习任我行第二阶段个人总结6
    自习任我行第二阶段个人总结5
    自习任我行 第二阶段每日个人总结4
    自习任我行 第二阶段每日个人总结3
    自习任我行 第二阶段每日个人总结2
    自习任我行 第二阶段每日个人总结1
    结课总结
  • 原文地址:https://www.cnblogs.com/jfl-xx/p/4820085.html
Copyright © 2020-2023  润新知