有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据搜索,算法适用于少量数据的排序。时间复杂度为 O(n^2),是一种稳定的排序算法。
插入排序算法把要排序的数组分成两部分:第一部分包含了这个数组除了最后一位的所有元素,而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序后,再将最后这个元素插入到第一部分中的正确位置。
说明:这里的最后一位,也可以是最前的一位。
在编程实现中,一般用二重循环实现,外循环变量设为 i,内循环变量设为 j 。把数组的前面一段排好序,然后把 j 依次减少,直到找到适合数组在 i 的数据,然后插入该数据,并把之后的数字往后移。
以下是该题目的代码实现:
1 package com.fhcq.insertsort;
2
3 public class InsertSort {
4
5 //主方法
6 public static void main(String[] args) {
7 // TODO Auto-generated method stub
8
9 int[] arr = { 3, 5, 4, 1, 8, 11, 9 }; //定义数组
10 doInsertSort(arr); //开始排序
11 }
12
13 //排序方法
14 private static void doInsertSort(int[] src) {
15 // TODO Auto-generated method stub
16 int len = src.length; //获取数组长度
17 for (int i = 1; i < len; i++) { //遍历数组,从1开始
18 int j; //定义变量 j
19 int temp = src[i]; //临时存储当前的数字
20 for (j = i; j > 0; j--) { //遍历 i 之前的数字
21 //如果前面的数字大于后面的,则把大的值赋到后边
22 if(src[j-1]>temp){
23 src[j] = src[j-1];
24 }else{
25 //如果当前的数,不小于前面的数,那就说明不小于前面所有的数
26 //因为前面已经是排好了序的,所以直接返回当前一轮的比较
27 break;
28 }
29 }
30 src[j] = temp; //把空缺位置的数字赋值为原来的值
31 }
32 print(src); //打印
33 }
34
35 //打印方法
36 private static void print(int[] before) {
37 // TODO Auto-generated method stub
38 for (int i = 0; i < before.length; i++) { //遍历
39 System.out.print(before[i]+""); //打印,以空格隔开
40 }
41 System.out.println(); //换行
42 }
43
44 }
45