由插入排序的原理可得,在每次插入时需要将前面的数组看成是一个已排序的数组,而且需要一个对象来暂存待排数据,所以在对java的线性表进行插入排序时,我们可以给线性表的第一个元素设为大小为0的辅助空间,我将之称为哨兵,每次排序时可将待排序的数据暂存到哨兵,在线性表中查找插入位置,由查找的方法又可以将插入排序分为直接插入排序和二分插入排序。
代码如下:
直接插入排序
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();
for (int i = 0;i<10;i++){
list.add(random.nextInt(100)); //插入十个随机数
}
list.add(0,0); //增加一个哨兵(辅助空间)
System.out.print("排序前:"+list+" ");
System.out.println(" ");
int i ,j;
for ( i = 2; i <list.size() ; i++) { //因为增加了一个哨兵,所以从第三个数据开始
if (list.get(i) < list.get(i-1)){ //若< ,则将第i个坐标的数插入有序表
list.set(0, list.get(i)); //复制为第一个元素(哨兵)
for (j=i-1;list.get(0)<list.get(j);j--){
list.set(j+1,list.get(j)); //继续往后看
}
list.set(j+1,list.get(0));//插入到正确位置
}
}
list.remove(0); //移除哨兵
System.out.print("排序后:"+list+" ");
}
二分插入排序
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();
for (int i = 0;i<10;i++){
list.add(random.nextInt(100)); //插入十个随机数
}
list.add(0,0); //增加一个哨兵(辅助空间)
System.out.print("排序前:"+list+" ");
System.out.println(" ");
for (int i =2 ; i <list.size() ; i++) { //依次插入第2~第n个元素
list.set(0,list.get(i)); //当前插入元素存到哨兵位置
int low = 1, height = i-1,mid;//采用二分查找发插入位置
while (low <= height){
mid = (low+height)/2;
if (list.get(0) < list.get(mid)) height = mid-1;
else low = mid+1;
}//循环结束,hight+1则为插入位置
for (int j = i-1; j >= height+1 ;j--) list.set(j+1,list.get(j));//移动元素
list.set(height+1,list.get(0));//插入到正确位置
}
list.remove(0);//去除哨兵
System.out.print("排序后:"+list+" ");
}