插入排序

插入排序

一、核心思想:從數組第二個元素開始,該元素如果大於前元素則可繼續下一個元素;
如果該元素小於前元素,則往前插入,直到沒有小於該元素爲止。

二、過程:

標題

三、時間複雜度:O(n²)=1+2+3+...+n-1
四、空間複雜度:O(1)
五、 原址排序
六、穩定性:由於是從後往前,後續元素如果存在前面相等的,無法越過,相對位置不會發生變化。

七、一般解法:

import java.util.Arrays;
public class InsertSort {
	  public static void main(String[] args) {
		    int[] arr = getRandomArr(10, 1, 20 );
		    System.out.println( "begin..." + Arrays.toString( arr ) );
		    insertSort( arr, 0, arr.length - 1 );
		    System.out.println( "final..." + Arrays.toString( arr ) );
		  }
  //插入排序核心算法
  public static void insertSort(int[] arr, int begin, int end) {
    for (int j = begin + 1; j <= end; j++) {//從第二個元素開始
      int key = arr[j];//待插入的數,首次爲第二個元素
      int pre = j - 1;//前面的數,首次爲第一個元素下標。
      while (pre >= begin && arr[pre] > key) {//如果前面下標大於等於開始下標並且前面的數大於待插入的數,則把前面的數不斷往後移動,直到前面的數沒有比待插入的數大了就結束循環
        arr[pre + 1] = arr[pre];//待插入數前面的數往後移,這時要注意前面元素後移了,那麼前面元素沒有值了。
        pre--;//前面的數下標再前移
      }
      arr[pre + 1] = key;//沒有再比待插入的數小了,所以它的位置就確定了。把待插入的數放進前面的數的位置。
    }
  }
  //獲得隨機數組
  public static int[] getRandomArr(int length, int min, int max) {
	int arr[]=new int[length];
	for(int i=0;i<length;i++) {
		arr[i]=(int)(Math.random()*(max-1+min)+min);//Math.random()*(隨機數的範圍)+隨機數的最小值
	}
	return arr;
}
}

八、遞歸解法

import java.util.Arrays;
public class Test {
	public static void main(String[] args) {
		int[] arr = getRandomArr(10, 1, 20);
		System.out.println("原數組:" + Arrays.toString(arr));
		insertSort(arr, arr.length - 1);
		System.out.println("排序後:" + Arrays.toString(arr));
	}

	// 插入排序核心算法
	private static void insertSort(int[] arr, int k) {
		//遞歸出口
		if(k==0)
			return;
		//對前k-1個元素排序
		insertSort(arr,k-1);
		//把位置k的元素插入到前面的部分
		int key=arr[k];
		int pre=k-1;
		while(pre>-1&&key<arr[pre]) {//小的往前插
			arr[pre+1]=arr[pre];//比較元素往後移動
			pre--;
		}
		arr[pre+1]=key;
		}

	// 生成隨機數組
	private static int[] getRandomArr(int length, int min, int max) {
		int[] arr = new int[length];
		for (int i = 0; i < length; i++) {
			arr[i] = (int) (Math.random() * (max - 1 + min) + min);
		}
		return arr;
	}
}

 

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