插入排序

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

基本思想:

  把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 }
原文地址:https://www.cnblogs.com/HuiH/p/11665479.html