java 插入排序

1.插入排序从字面上理解很简单,就是将需要添加的数据,插入到合适的位置。
2.设数组为a[0…n-1]。
  •     初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
  •     将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
  •    i++并重复第二步直到i==n-1。排序完成。
3.下面举个简单的例子
对数组a={2 , 8 ,6}进行插入排序,可以如图:
4.下面直接通过代码来进行解释:
将数组int[] data = { 2, 45, 6, 8, 4, 1, 57, 4, 6, 2, 45 };按从小到大的进行排列
 1 public static void insertSort(int[] a) {
 2         int n = a.length;
 3         int i, j, k;
 4 
 5         for (i = 0; i < n; i++) {
 6             int temp = a[i];
 7             // 找出需要插入对应的位置,从两个数开始
 8             for (j = i - 1; j >= 0; j--) {
 9                 if (a[i] > a[j]) {
10                     break;
11                 }
12             }
13             // 记录后的j就是需要插入的位置
14             // 将数组评议后数据插入,若插入数据比边界值大的话就不进行插入
15             if (j != i - 1) {
16                 for (k = i - 1; k > j; k--) {
17                     a[k + 1] = a[k];
18                 }
19                 a[k + 1] = temp;
20             }
21         }
22     }
上面代码是严格按照插入排序的思想一步一步来的,现在对上面的代码进行优化,
 
将搜索和数据后移这二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果 a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据 a[j]<a[i]时停止并将temp放到a[j + 1]处。
 1 public static void insertSort2(int[] a) {
 2         int n = a.length;
 3         int i, j, temp;
 4         for (i = 1; i < n; i++) {
 5             temp = a[i];
 6             if (a[i] < a[i - 1]) {
 7                 for (j = i - 1; j >= 0 && temp < a[j]; j--) {
 8                     a[j + 1] = a[j];
 9                 }
10                 a[j + 1] = temp;
11             }
12 
13         }
14 
15     }

完整代码:

 1 public static void main(String[] args) {
 2 
 3         int[] data = { 2, 45, 6, 8, 4, 1, 57, 4, 6, 2, 45 };
 4         insertSort2(data);
 5         for (int t = 0; t < data.length; t++) {
 6             System.out.print("a[" + t + "]=" + data[t] + "   ");
 7         }
 8     }
 9 
10     public static void insertSort(int[] a) {
11         int n = a.length;
12         int i, j, k;
13 
14         for (i = 0; i < n; i++) {
15             int temp = a[i];
16             // 找出需要插入对应的位置,从两个数开始
17             for (j = i - 1; j >= 0; j--) {
18                 if (a[i] > a[j]) {
19                     break;
20                 }
21             }
22             // 记录后的j就是需要插入的位置
23             // 将数组评议后数据插入,若插入数据比边界值大的话就不进行插入
24             if (j != i - 1) {
25                 for (k = i - 1; k > j; k--) {
26                     a[k + 1] = a[k];
27                 }
28                 a[k + 1] = temp;
29             }
30         }
31     }
32 
33     public static void insertSort2(int[] a) {
34         int n = a.length;
35         int i, j, temp;
36         for (i = 1; i < n; i++) {
37             temp = a[i];
38             if (a[i] < a[i - 1]) {
39                 for (j = i - 1; j >= 0 && temp < a[j]; j--) {
40                     a[j + 1] = a[j];
41                 }
42                 a[j + 1] = temp;
43             }
44 
45         }
46 
47     }
View Code

 

 
 
 
posted @ 2015-05-28 21:04  perfect亮  阅读(241)  评论(0)    收藏  举报