zoukankan      html  css  js  c++  java
  • 插入排序

    插入排序是一种稳定的排序算法。

    基本思想:

      把N个待排序元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有N-1个元素;每次从无序表中取出一个元素,将它插入到有序表中,使之成为新的有序表,重复N-1次完成整个排序过程。

    算法分析:

      1)从序列第一个元素开始,该元素可以认为已经被排序;

      2)去下一个元素设为待插入元素,在已排序的序列中从后向前扫描,如果该元素大于带插入元素,将该元素移到下一个位置;

      3)重复步骤2),直到找到已排序的元素小于或等于待排序元素的位置,插入元素;

      4)重复2),3)步骤,完成排序。

    时间复杂度:

      1)顺序排列时,只需比较(N-1)次,插入排序的时间复杂度为O(n);

      2)逆序排序时,只需比较N(N-1)/2 次,插入排序时间复杂度为O(n2);

      3)当原始序列是无序时,平均时间复杂度为O(n2);

    空间复杂度:

      插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1)

    排序过程图:

    接下来看一下具体的Java代码实现:

    第一种形式:

     1 public void sort(int arr[]) {
     2     for(int i =1; i<arr.length;i++) {
     3         int insertVal = arr[i];    //插入的数
     4         int index = i-1;    //被插入的位置(准备和前一个数比较)
     5         while(index>=0&&insertVal<arr[index]) {    //如果插入的数比被插入的数小
     6             arr[index+1]=arr[index];    //将把 arr[index] 向后移动
     7             index--;    //让 index 向前移动
     8         }
     9         arr[index+1]=insertVal;    //把插入的数放入合适位置
    10     } 
    11 }

     第二种形式:

     1 public class InsertSort {
     2     public static void main(String[] args) {
     3         int a[] = {3,1,5,7,2,4,9,6};
     4         new InsertSort().insertSort(a);
     5     }
     6 //直接插入排序算法的实现
     7     private void insertSort(int[] a) {
     8         for( int i=1;i<a.length;i++){
     9             int temp = a[i];       //temp为本次循环待插入有序列表中的数
    10             for(int j=i-1;j>=0 && a[j]>temp;j--){      //寻找temp插入有序列表的正确位置
    11                 a[j+1] = a[j];      //元素后移,为插入temp做准备
    12             }
    13             a[j+1] = temp;       //插入temp
    14             print(a,a.length,i);
    15         }
    16         printResult(a,a.length);
    17     }
    18    //打印排序的最终结果
    19     private void printResult(int[] a){
    20         System.out.print("最终排序结果:");
    21         for(int j=0;j<a.length;j++){
    22             System.out.print(" "+a[j]);
    23         }
    24         System.out.println();
    25     }
    26   // 打印排序的每次循环结果
    27     private void print(int[] a, int i) {
    28         System.out.print("第"+i+"次:");
    29         for(int j=0;j<a.length;j++){
    30             System.out.print(" "+a[j]);
    31         }
    32         System.out.println();
    33     }
    34 }
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/HuiH/p/11665479.html
Copyright © 2011-2022 走看看