1. 程式人生 > 實用技巧 >資料結構之插入排序(Java)

資料結構之插入排序(Java)

1、基本思想
依次取出陣列中的元素,將其插入到已經排好序的元素序列中,得到一個新的、排好序的陣列。即每一步將一個數據插入到前面已經排好序的陣列中,直到全部插入完為止。

2、演算法描述
(1)從第i個元素開始(第一個元素認為已經被排序,因此i=1),將待插入的值賦值為temp=array[i](設定“監視哨”,即待插入的值);
(2)在已經被排序的元素序列中進行搜尋,從後向前掃描,設定開始掃描的位置j(j=i-1);若搜尋到第j個元素大於“監視哨”的值(即array[j]>=temp)時,將該元素移到下一個位置(即array[j+1]= array[j]);
(3)重複(2),將temp插入到array[j+1]的位置上;
(4)重複(1)。

3、程式碼實現(Java語言)

import java.util.Scanner;

public class InsertSort {
   public static void main(String[] args) {
       Scanner scanner=new Scanner(System.in);
       System.out.println("請輸入一個整數陣列(並用逗號隔開):");
       String str=scanner.next();
       String[] arr1=str.split(",");
       int[] arr=new int[arr1.length];
       for (int i=0;i<arr.length;i++){
           arr[i]=Integer.parseInt(arr1[i]);   //將string型轉換成int型
       }
       System.out.print("初始陣列:");
       printArray(arr);
       System.out.println();

       insertSort(arr);
       System.out.print("排序之後的最終結果:");
       printArray(arr);
       System.out.println();
   }

   //列印陣列
   public static void printArray(int arr[]){
       for (int i:arr){
           System.out.print(i+" ");
       }
   }

   //插入排序
   public static void insertSort(int[] arr){
       int i,j;
       for (i=1;i<arr.length;i++){
           int temp=arr[i];
           for (j=i-1;j>=0 && arr[j]>temp;j--){
               arr[j+1]=arr[j];
           }
            //for迴圈中j減了一次,所以是j+1
           arr[j+1]=temp;
           System.out.print("第"+i+"趟排序之後的陣列:");
           printArray(arr);
           System.out.println();
       }
   }
}

4、演算法分析
(1)時間複雜度
如果待排序陣列是有序的,只需當前元素跟前一個元素比較一下就可以了,這時一共需要比較N- 1次,時間複雜度為O(N)。最壞的情況是待排序陣列是逆序的,總的比較次數為1+2+3+…+N-1,所以,插入排序最壞情況下的時間複雜度為O(n^2),平均情況和最壞情況的時間複雜度一樣。
(2)穩定性分析
在插入排序中,兩個及以上的相同的資料,在排序之後位置是不會發生變化的,所以插入排序是穩定的排序方法。