标签:
1.原理
直接插入排序原理和插牌方法类似,它将数组看作有序元素和无序元素组成的数组,把无序的元素插入到有序的数组中。
已知待排序数组a=[4,2,1,3].
综述:4为待插入数,4>2,变为[2,4,1,3]; 1为待插入数,4>1和2,变为[1,2,4,3]; 3为待插入数,4>3,3>1和2,变为[1,2,3,4].
第一次排序:
有序元素:[4],待插数:2
抓到2,因为4>2,将4后移,即a[1]=4;
[4,4]
再将2插到a[0]中,即a[0]=2;
[2,4]
第二次排序:
有序元素:[2,4],待插数:1
抓到1,因为4>1,将4后移,即a[2]=4;
[2,4,4]
因为2>1,将2后移,即a[1]=2;
[2,2,4]
再将1插入到a[0]中,即a[0]=1;
[1,2,4]
第三次排序:
有序元素:[1,2,4],待插数:3
抓到3,因为4>3,将4后移,即a[3]=4;
[1,2,4,4]
因为2<3,无需将剩余有序数组元素和3比较,将3插入到a[2],即a[2]=3;
[1,2,3,4]
2.代码实现
public class InsertSortTest {
//遍历数组
public static void cc(int a[]){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void Test(int a[]) {
for (int i = 1; i < a.length; i++) { //从第二个数开始
int temp = a[i]; //设置待插入数
int j = i - 1;
while (j >= 0 && a[j] > temp) { //将待插入的数和前面的有序数组元素进行比较
a[j + 1] = a[j]; //如果前面的有序数组元素大于待插入数,则将有序数组元素后移
InsertSortTest.cc(a);
j--;
}
a[j + 1] = temp; //如果某有序数组元素小于待插入数,终止后移,并且在该元素后插入待插入数
InsertSortTest.cc(a);
}
}
public static void Test1(int a[]) {
for (int i = 1; i < a.length; i++) {
int temp = a[i];
while (i >= 1 && a[i-1] > temp) {
a[i ] = a[i-1];
i--;
}
a[i] = temp;
}
}
public static void Test2(int a[]) {
for (int i = 1; i < a.length; i++) {
int temp = a[i];
int j=i-1;
for(;j>=0;j--){
if(a[j] > temp){
a[j + 1] = a[j];
InsertSortTest.cc(a);
}
else{
break;
}
}
a[j+1] = temp;
InsertSortTest.cc(a);
}
}
public static void main(String[] args) {
int a[]={4,2,1,3};
InsertSortTest.Test(a);
}
}
标签:
原文地址:http://www.cnblogs.com/jfl-xx/p/4820085.html