您的位置:首页 > 其它

排序算法之直接插入排序

2017-04-28 10:13 162 查看
阅读目录
1、基本思想
2、代码示例
3、效率分析

回到目录


1、基本思想

  在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经有序的,现在要把第n个数插到前面的有序数中,使得这n个数也是有序的。如此反复循环,直到全部排好顺序。这个思想类似打扑克的时候抓牌的情形。
回到目录


2、代码示例

package  sort;

public class InsertSort {

public void TestSort() {
int a[]={49,38,65,97,76,13,27,49,78,34,34,15,35,25,53,51};
sort(a);
}

public void sort(int arr[]) {
int i, j;
//数组长度。
int len = arr.length;
//临时变量,用于存放当前插入的元素。
int temp;
//假定第一个元素arr[0]已经在正确的位置上。
//则仅需遍历 arr[1]-arr[n-1]列表。
for (i = 1; i < len; i++) {
//对于每次遍历,从arr[0]-arr[i-1]范围内的元素已经是有序的。
//每次遍历的任务是:通过循环前面已排序的子列表,将arr[i]的元素插入到从arr[0]到a[i-1]列表中的正确位置上。
j = i;
//将arr[i]复制给temp。
temp = arr[i];
//向前循环列表,比较temp与arr[j-1]、arr[j-2]...的大小。
//当temp大于或等于arr[j-1]或者在列表开始处结束。
while (j > 0 && temp < arr[j - 1]) {
//满足条件,arr[j-1]元素向后移一位。
arr[j] = arr[j - 1];
j--;
}
//循环结束,将temp复制给arr[j]
arr[j] = temp;
}
for (i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}


回到目录


3、效率分析

  空间复杂度O(1)

  时间复杂度O(n2)

  最差情况:反序,需要移动n*(n-1)/2个元素

  最好情况:正序,不需要移动元素

  数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n);

  插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。

出处:http://hehaiyang.cnblogs.com/
本博客内容主要以学习、研究和分享为主,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐