java 插入排序
1.插入排序从字面上理解很简单,就是将需要添加的数据,插入到合适的位置。
2.设数组为a[0…n-1]。
View Code
- 初始时,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 }

浙公网安备 33010602011771号