码迷,mamicode.com
首页 > 编程语言 > 详细

经典排序之插入排序

时间:2017-12-17 20:47:32      阅读:18      评论:0      收藏:0      [点我收藏+]

标签:插入   位置   []   ring   演示   有序数组   相对   接下来   复杂度   

插入排序(Insertion Sort)的基本思想是:将一个待排序的无序数组分成两部分,通常情况下,将数组首个或者末尾元素视为一个有序数组,将其余部分视为一个无序数组。然后,遍历剩下的n-1个元素,并将其逐个与有序数组部分里的元素做比较,以升序排列为例,将无序数组部分里的元素插入到有序数组部分,并总是确保有序数组部分保持升序排列,直至无序数组中的元素遍历完为止。

我们接下来通过代码演示:

/**
 * 插入排序
 * @author 李章勇
 */
import java.util.Arrays;
public class Demo1 {
static int k=0;
static void insertSort(int[] arr){
System.out.println("排序前:"+Arrays.toString(arr));
for(int i=1;i<arr.length;i++){//从数组的角标1到arr.length-1
if(arr[i-1]>arr[i]){//如果角标为i的前一个元素比其大
int temp=arr[i];//将arr[i]赋给一个中间变量
int j=i;//存储下角标i的位置
while(j>0 && arr[j-1]>temp){//循环,j总会大于0,所以循环总会执行
arr[j]=arr[j-1];//如果arr[j-1]>temp,则将较大的数插入后面相邻位置,
j--;//然后j--,依次向前判断,
}
arr[j]=temp;//直至j到角标0的位置,以确保将0-i间最小的数插入首位,以此类推,组成一个新的有序数组
}
System.out.println("第  "+(++k)+" 次:"+Arrays.toString(arr));
}
System.out.println("排序后:"+Arrays.toString(arr));
}
public static void main(String[] args) {
int[] arr={15,23,8,4,6,9,19};
insertSort(arr);
}
}

 上述代码运行结果如下:

排序前:[15, 23, 8, 4, 6, 9, 19]
第  1 次:[15, 23, 8, 4, 6, 9, 19]
第  2 次:[8, 15, 23, 4, 6, 9, 19]
第  3 次:[4, 8, 15, 23, 6, 9, 19]
第  4 次:[4, 6, 8, 15, 23, 9, 19]
第  5 次:[4, 6, 8, 9, 15, 23, 19]
第  6 次:[4, 6, 8, 9, 15, 19, 23]
排序后:[4, 6, 8, 9, 15, 19, 23]

  最后,插入排序算法的时间复杂度为O(n2),是稳定的排序算法。

【备注:之所以稳定,是指当一个待排序数组中存在两个元素一样的情况时,如数组中有同为6个两个元素,通过插入排序,可以有效确保这两个数的相对前后位置。】 

经典排序之插入排序

标签:插入   位置   []   ring   演示   有序数组   相对   接下来   复杂度   

原文地址:http://www.cnblogs.com/lizhangyong/p/8053027.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!