定義
無聊的解釋(百度百科):
假設我們輸入的是 5,1,4,2,3 我們從第二個數字開始,這個數字是1,我們的任務只要看看1有沒有正確的位置,我們的做法是和這個數字左邊的數字來比,因此我們比較1和5,1比5小,所以我們就交換1和5,原來的排列就變成了 1,5,4,2,3
接下來,我們看第3個數字有沒有在正確的位置。這個數字是4,它的左邊數字是5,4比5小,所以我們將4和5交換,排列變成了 1,4,5,2,3我們必須繼續看4有沒有在正確的位置,4的左邊是1,1比4小,4就維持不動了,以此類推。。。
插入排序的日常應用
簡單示例
Java示例代碼
兩種:1.交換;2.賦值
public class InsertSort {
public static void main(String[] args) {
int[] arr = SortUtils.getRandomIntArray(10000, 1, 1000);
insertSort2(arr);
SortUtils.printArray(arr);
}
private static void insertSort(int[] arr) {
int length = arr.length;
for (int i = 1; i < length; i++) {
//尋找元素arr[i]的合適插入位置
//1.如果j-1位置值比j位置值大,交換
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
SortUtils.swap(arr,j,j-1);
}else{
break;
}
}
}
}
private static void insertSort2(int[] arr) {
int length = arr.length;
for (int i = 1; i < length; i++) {
//尋找元素arr[i]的合適插入位置;
// 1.提取出arr[i];
// 2.如果j-1位置的數比j位置值大,j位置值等于j-1位置;
// 3.把提取出來的值賦值給及位置
int temp = arr[i];
int j = i;
for(;j>0;j--){
if(arr[j-1]>temp){
arr[j] = arr[j - 1];
}else{
break;
}
}
arr[j] = temp;
}
}
}
Kotlin
fun main(args: Array<String>) {
val arr = SortUtils.getRandomIntArray(10000,1,1000)
insertSortKt2(arr)
SortUtils.printArray(arr)
}
//交換
fun insertSortKt(arr:IntArray){
val length =arr.size
for ((key,value) in arr.withIndex()){
var j = key
while (j>0&&(arr[j-1]-arr[j])>0){
SortUtils.swap(arr,j-1,j)
j--
}
}
}
//賦值
fun insertSortKt2(arr:IntArray){
val length =arr.size
for ((key,value) in arr.withIndex()){
var j = key
var temp =arr[j]
while (j>0&&(arr[j-1]-temp)>0){
arr[j]=arr[j-1]
j--
}
arr[j]=temp
}
}
后記
- 賦值的排序方法要比交換的運行速度快。尤其是一些數據基本已經有序,只有幾個無序時,尤其適用。
- Kotlin不能直接使用工具類中的反射,這個還沒太研究明白=。=