八大排序-插入排序

數據結構與算法—基礎大綱(Java版)java

概要

插入排序是一種簡單直觀的排序算法。 它的工做原理是經過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。算法

插入排序原理

排序過程

11.png
插入排序的核心是循環將數組插入有序序列中,使得數組從小到大最終有序。上圖以數組int n[] = { 6, 5, 2, 7, 3, 9, 8 }爲例,第一趟排序將6插入僅一個元素的數組序列{ 5 }中,構造出有序序列{ 5, 6 };第二躺排序將2插入2個元素的數組序列{ 5, 6 }中,繼續構造出有序序列{ 2, 5, 6 },如此循環最終整個數組有序。

一趟排序

22.png

以第四趟排序說明,一趟排序的詳細過程爲:當待插入數字比有序數組當前位置數字小時,將有序數組當前數字日後移一位,並將待插入數字插入到數組當前位置,反正若是待插入數字大於或等於有序數組當前位置數字則無需交換,一趟排序結束。將待插入數字3和有序數組{ 2, 5, 6, 7 }進行從後往前對比,第一次3和7對比交換獲得{ 2, 5, 6, 3, 7 },第二次3和6對比交換獲得{ 2, 5, 3, 6, 7 },第三次3和5對比交換獲得{ 2, 3, 5, 6, 7 },第四次3和2對比交換獲得{ 2, 3, 5, 6, 7 },由於是有序數組所以無需繼續往前對比能夠結束對比(事實上也達到了邊界)。數組

編碼實踐

public class Test {

	public static void main(String[] args) {
		int n[] = { 6, 5, 2, 7, 3, 9, 8 };
		insertSort(n);
		System.out.print("插入排序結果:");
		for (int m : n) {
			System.out.print(m + " ");
		}
	}

	/** * 插入排序 * * @param n 待排序數組 */
	public static void insertSort(int n[]) {
		for (int i = 1; i < n.length; i++) {
			int temp = n[i];
			for (int j = i - 1; j >= 0; j--) {
				if (temp < n[j]) {
					n[j + 1] = n[j];
					n[j] = temp;
				} else {
					break;
				}
			}
		}
	}
複製代碼
  • 結果
插入排序結果:2 3 5 6 7 8 9 
複製代碼

編碼說明

for循環(注意循環次從數組下標1開始,待插入數字初始爲第2個數,第一個數構成初始已排序數組)
   1、聲明待插入數字;
   2for循環進行一躺插入排序(從已排序數組的最後一位開始往前對比);
       2.1、若待插入數字小於已排序數組中當前數字,則將當前數組數字後移一位,並將數組當前數字賦值爲待插入數字;
       2.2、若待插入數字大於或等於已排序數組中當前數字,一趟循環結束;

複製代碼

一趟排序的優化

在插入思想不變的狀況下,能夠減小一躺排序中的循環中的對當前位置的賦值操做,即n[j] = temp。具體以下圖所示: bash

33.png

編碼實踐

/** * 插入排序 * * @param n 待排序數組 */
	public static void insertSort(int n[]) {
		for (int i = 1; i < n.length; i++) {
			int temp = n[i];
			int j = i - 1;
			for (; j >= 0; j--) {
				if (temp < n[j]) {
					n[j + 1] = n[j];
				  //n[j] = temp; 減小循環賦值操做
				} else {
					break;
				}
			}
			//一躺對比結束後,將待插入數字插入最後結束循環位置的後一位
			n[j + 1] = temp;
		}
	}
複製代碼

與優化前對比,主要將插入賦值操做放在一躺排序結束後。數據結構

結語

本篇以最簡單的圖文形式講解八大排序之一的插入排序的核心思想和具體實現,插入排序對有序數組進行插入的思想在不少算法或是算法優化中都會使用到,是一種十分重要的基礎排序算法~post

Alt

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索