经典排序之插入排序

Posted 奔跑在梦想的道路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序之插入排序相关的知识,希望对你有一定的参考价值。

插入排序(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个两个元素,通过插入排序,可以有效确保这两个数的相对前后位置。】 

以上是关于经典排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章

经典排序之插入排序

经典十大排序算法之8种内部常见排序算法

经典排序之插入排序

十大经典排序之冒泡,选择,插入排序

经典排序算法系列之插入排序和希尔排序----小白理解(python)

经典排序之希尔排序