插入排序
一、核心思想:從數組第二個元素開始,該元素如果大於前元素則可繼續下一個元素;
如果該元素小於前元素,則往前插入,直到沒有小於該元素爲止。
二、過程:
三、時間複雜度: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;
}
}