1. 程式人生 > >演算法(2) 插入排序演算法 java

演算法(2) 插入排序演算法 java

簡介:插入排序和選擇排序一樣都是時間複雜度為O(N^2)的排序演算法,相較於選擇排序,插入排序可以提前終止內層迴圈,因此在效能上如果使用得當,要比選擇排序效能好,尤其是面對近乎有序的源資料時,效能更是碾壓選擇排序甚至會比一些O(NlgN)的演算法還要好.

原理:將一個數組劃分為兩部分,第一部分是已經排好序的,第二部分為未排序的,從未排序部分的第一個資料開始,逐一與前面已排好序的資料進行比較,如果比那個資料小就與之交換,直到該資料比當前資料大為止.按照以上原理將所有資料進行排序.

 步驟
  ①從未排好序的資料中取出第一個資料,作為待排序資料A
  ②用A與前面已排好序的資料B進行對比用來確定A應該放到哪個位置,如果A比B還小就應該交換A與B,否則停止內層迴圈,該位置就是A應處於的位置
  ③重複①②步驟直到沒有未排序的資料為止

public class InsertionSort {
	public static void main(String[] args) {
		int[] arr = SortUtils.createArray(10000);
		int[] arr2 = SortUtils.copy(arr);
		sort(arr);
		betterSort(arr2);
	}
	
	public static void sort(int[] arr) {
		long starttime = System.currentTimeMillis();
		for (int i = 1; i <= arr.length - 1; i++) {
			for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) {
				arr[j - 1] = arr[j - 1] + arr[j];
				arr[j] = arr[j - 1] - arr[j];
				arr[j - 1] = arr[j - 1] - arr[j];
			}
		}
		System.out.println("sort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
	}
	/**
	 * 改進後的插入排序,在具有較少的元素型別值,或者比較有序的源資料進行排序時,可以有比較好的效果
	 * @param arr
	 */
	public static void betterSort(int[] arr) {
		long starttime = System.currentTimeMillis();
		for (int i = 1; i <= arr.length - 1; i++) {
			int t = arr[i];
			int j = i;
			for (; j > 0 && arr[j - 1] > t; j--) {
				arr[j] = arr[j - 1];  
			}
			if (j != i) {
				arr[j] = t;
			}
		}
		System.out.println("betterSort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
	}

}
以下是執行截圖


結論:優化之後的插入排序比未優化的插入排序 效能會好一些, 比選擇排序更是全方位的勝出