1. 程式人生 > 實用技巧 >排序演算法之直接插入排序

排序演算法之直接插入排序

一、直接插入排序

  思想:假設待排資料有n個,將待排序列分為有序和無序兩個部分,初始時,有序部分僅有一個數據即為第一個資料,其餘n-1個數據為無序序列,然後將無序序列的每個資料分別與有序序列的每個資料比較,插入到合適位置。(無序序列資料從有序序列最後一個數開始往前比較)。   例如:

  分析:我們考慮最壞的情況,當陣列完全逆序的時候比如{6,5,4,3,2,1}這種情況,我們進行升序排序,我們比較的次數:1+2+3+4+5,資料移動的次數:1+2+3+4+5。擴充套件到n個元素的陣列 比較次數:1+2...+n-1 = n(n-1)/2,移動的次數同樣為n

(n-1)/2,所考慮資料隨機的情況,時間複雜度為(n^2 -n)/2 = O(n2)。從這裡可以看出同樣的O(n2)時間複雜度,直接插入排序比選擇排序和氣泡排序效能要要一些。直接插入排序對陣列基本有序和陣列元素比較少的時候,速度比較快。

  程式碼:
/* 用直接插入排序演算法實現對陣列元素升序排列 */ package edu.java.InsertSort; import java.util.Scanner; public class InsertSortTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請輸入待排序列個數:"); int n = scanner.nextInt(); int[] array = new int[n + 1]; System.out.println("請輸入陣列元素"); for (int i = 1; i <= n; i++) { array[i] = scanner.nextInt(); } insertSort(array,n); } public static void insertSort(int array[], int n) { //從第二個元素開始將無序區每個元素與有序區元素比較;array[0]為監視哨 for (int i = 2; i <= n; i++) { //若無序區第一個元素小於有序區最後一個元素 if (array[i] < array[i - 1]) { //將array[i]的值賦給監視哨 array[0] = array[i]; //從有序區後面開始與監視哨的值作比較 for (int j = i - 1; array[0] < array[j]; j--) { //元素後移 array[j+1] = array[j]; array[j] = array[0]; } } } System.out.println("----------------------"); System.out.println("排序完成,升序序列為:"); for (int i = 1; i <= n ; i++) { System.out.println(array[i]); } } }