Java數據結構(12)----插入排序

插入排序

插入排序,一般也被稱爲直接插入排序。對於少量元素的排序,它是一個有效的算法 。插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經排好序的有序表中,從而一個新的、記錄數增1的有序表。在其實現過程使用雙層循環,外層循環對除了第一個元素之外的所有元素,內層循環對當前元素前面有序表進行待插入位置查找,並進行移動

基本思想

插入排序的工作方式像許多人排序一手撲克牌。開始時,我們的左手爲空並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。爲了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。拿在左手上的牌總是排序好的,原來這些牌是桌子上牌堆中頂部的牌 。
插入排序是指在待排序的元素中,假設前面n-1(其中n>=2)個數已經是排好順序的,現將第n個數插到前面已經排好的序列中,然後找到合適自己的位置,使得插入第n個數的這個序列也是排好順序的。按照此法對所有元素進行插入,直到整個序列排爲有序的過程,稱爲插入排序 。
先上代碼

//插入排序
	public static void insertSort(int[] arr) {
		int insertVal = 0;
		int insertIndex = 0;
		for(int i = 1; i < arr.length; i++) {
			//定義待插入的數
			insertVal = arr[i];
			insertIndex = i - 1; // 即arr[1]的前面這個數的下標
	
			// 給insertVal 找到插入的位置
			// 1. insertIndex >= 0 保證在給insertVal 找插入位置,不越界
			// 2. insertVal < arr[insertIndex] 待插入的數,還沒有找到插入位置
			// 3. 就需要將 arr[insertIndex] 後移
			while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
				insertIndex--;
			}
			//這裏我們判斷是否需要賦值
			if(insertIndex + 1 != i) {
				arr[insertIndex + 1] = insertVal;
			}
		}
	}

圖解

假設我們有一個數組6位{39, 34, 116, 7, -9, 89}

第一趟進行排序

1.insertVal = arr[i];
insertIndex = i - 1;
在這裏插入圖片描述
2.進入while循環判斷符合條件
在這裏插入圖片描述
3.if循環判斷符合條件賦值
在這裏插入圖片描述

第一趟循環結果[34, 39, 116, 7, -9, 89]

第二趟進行排序

在這裏插入圖片描述
不符合while循環和if循環直接進入第三次循環

第二次循環結果[34, 39, 116, 7, -9, 89]

第三趟進行排序

1 insertindex指向下標爲2的數組元素, insertVal = arr[3]=7;
在這裏插入圖片描述
2
進入while 循環
下標爲3的數組元素等於下標爲2的數組元素
然後insertindex-1前移
在這裏插入圖片描述
3繼續進入while 循環
下標爲2的數組元素等於下標爲1的數組元素
然後insertindex-1前移
在這裏插入圖片描述
4 下標爲1的數組元素等於下標爲0的數組元素
然後insertindex-1前移
在這裏插入圖片描述
5 進入if判斷 符合條件 將7給下標爲0 的數組元素
在這裏插入圖片描述
第四次,第五次循環原理都是如此。

第三次循環結果[7, 34, 39, 116, -9, 89]

第四次循環結果[-9, 7, 34, 39, 116, 89]

第五次循環結果[-9, 7, 34, 39, 89, 116]

循環結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章