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 }
  • 相关阅读:
    [Ramda] allPass, propEq
    [Elm] Installing and setting up Elm
    [Node.js] Use nodejs-dashboard event loop delay with hrtime()
    [Node.js] Use Realm Object Database with Node.js
    [CSS] Manipulate Images Using CSS Filter and Blend Modes
    Android实现弹出输入法时,顶部固定,中间部分上移的效果
    [置顶] linux下让php支持mysql——寻找消失的mysql
    Conversion between json and object using SBJson lib
    Linux2.6内核--中断线被关闭的情况
    字符串、十六进制、byte数组互转
  • 原文地址:https://www.cnblogs.com/HuiH/p/11665479.html
Copyright © 2011-2022 走看看