Java插入排序算法实现
问题描述
输入:一组数据
<a1,a2,a3,...,an>
<script id="MathJax-Element-1" type="math/tex">
</script>
输出:排序数据
<b1,b2,b3,...,bn>,满足b1<b2<b3<...<bn−1<bn
<script id="MathJax-Element-2" type="math/tex">
,满足b_1
<...
算法思想
插入排序是最简单的排序算法之一,算法思想与我们玩纸牌思想类似,从左手为空开始,扑克牌背面朝上放于桌上,每次右手从桌上摸一张牌并将其插入到左手正确的位置使得左手牌保持有序,而为了能够找到正确的位置,我们从左手最右侧查看牌,知道找到正确位置将其插入。
以下是左手拿到的牌,已经排好序
当右手新拿到一张牌时,我们会与左手最右侧的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