深海的算法探索_插入排序算法(簡單插入排序/希爾排序)

常用的排序算法分爲

  1. 交換排序 ( 冒泡排序 / 快速排序 )   https://blog.csdn.net/qq_39731011/article/details/95204290
  2. 插入排序 ( 簡單插入排序 / 希爾排序 )    https://blog.csdn.net/qq_39731011/article/details/95342246
  3. 選擇排序 ( 簡單選擇排序 / 堆排序 )   https://blog.csdn.net/qq_39731011/article/details/95457842
  4. 歸併排序    https://blog.csdn.net/qq_39731011/article/details/95614787
  5. 基數排序 ( 桶排序 )    https://blog.csdn.net/qq_39731011/article/details/95995693

今天要說的是:插入排序

插入排序 顧名思義,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入

如下文中,您有別的見解,歡迎評論指正,深海謝過諸位靈長類

簡單插入排序

依據深海的理解舉一個簡單的例子:

未排序序列是:[5,9,8,4,2]

已排序序列是:暫時沒有.

第一次執行插入: 將5拿出來  放到已排序序列

執行後:

未排序序列是:[9,8,4,2]

已排序序列是:[5]

第二次執行插入: 將9拿出來, 從已排序序列從後向前掃描,發現對應的位置在5的後面

執行後:

未排序序列是:[8,4,2]

已排序序列是:[5,9]

第二次執行插入: 將8拿出來, 從已排序序列從後向前掃描,發現對應的位置在5和9的中間

執行後:

未排序序列是:[4,2]

已排序序列是:[5,8,9]

以此類推,最終排序完成

public int[] Test() {
	int[] array={5,9,8,4,2};
	int i,j,temp; //temp 正在執行插入的數
	for(i=1;i<array.length;i++) {
		temp=array[i];
		for(j=i-1;j>=0;j--) {
		   if (temp > array[j]) {  //順序正確,停止探索
			   break;
		   }else{//元素後移
	    	   array[j+1] = array[j]; 
	       }
		}
		array[j+1]=temp;
	}
    return array;
}

希爾排序

希爾排序呢就是簡單插入排序的升級版,

原理如下:

1.在邏輯的層面,將數組分成若干小數組,然後排序

2.之後將分組的條件更改,分組跨度變小,然後再排序

3.循環往復,直到跨度降到1時,排序整個數組.

該排序因爲分組原因,相同大小的數可能順序顛倒.所以該排序方式爲不穩定排序

public static void shellSort(int[] arr) {
		for(int gap=arr.length/2; gap>0; gap/=2) { /*步長逐漸減小*/
			for(int i=gap; i<arr.length; i++) { /*在同一步長內*/
				//同一步長內排序方式是插入排序
				int temp = arr[i], j; //待排元素
				//j-gap代表有序數組中最大數的下標,j-pag表示有序數組的前一個元素,減pag是減去偏移量就是步長
				for(j=i; j>=gap && temp<arr[j-gap]; j-=gap)
					arr[j] = arr[j-gap]; //原有序數組最大的後移一位
				arr[j] = temp; //找到了合適的位置插入
			}
		}
	}

 

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