Java插入排序算法實現
問題描述
輸入:一組數據
輸出:排序數據
算法思想
插入排序是最簡單的排序算法之一,算法思想與我們玩紙牌思想類似,從左手爲空開始,撲克牌背面朝上放於桌上,每次右手從桌上摸一張牌並將其插入到左手正確的位置使得左手牌保持有序,而爲了能夠找到正確的位置,我們從左手最右側查看牌,知道找到正確位置將其插入。
以下是左手拿到的牌,已經排好序
當右手新拿到一張牌時,我們會與左手最右側的A=15對比,然後K=14,Q, J ,10然後把6放到10的左側。
算法實現
import java.util.Random;
public class InsertSort {
/**
* 插入排序算法實現
* @param 待排序數組
*/
public static void sort(int [] arr){
//左手第一張牌不需要排序,從第二張開始排序
for(int i=1;i<arr.length;i++){
//右手拿第i張牌
int k = arr[i];
//從左手最右側開始比較,即第i-1張,要麼找到比k小的牌要麼找到左手最左側,即j=0
int j = i-1;
while(j>=0&&arr[j]<k){
//類似於挪開個空
//J Q K 空 A 6比A小
//J Q 空 K A 6比K小
//J 空 Q K A 6比Q小
///...
arr[j+1] = arr[j];
j--;
}
//插入右手新拿到的牌放到“空”的位置
arr[j+1] = k;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] arr = new int[30];
Random rnd = new Random();
for(int i=0;i<30;i++)
arr[i] = rnd.nextInt(1000);
InsertSort.sort(arr);
for(int i=0;i<30;i++){
System.out.println(arr[i]);
}
}
}
算法時間
外層循環n-1次
內層循環最壞i-1次,實際上是
算法最壞情形運行時間爲:
f(n)=O(n2)
演示結果
911 876 851 804 803 799 771 748 728 710 686 683 645 627 595 568 543 527 505 469 465 442 429 423 271 234 195 126 44 9