java数据结构之插入排序

由插入排序的原理可得,在每次插入时需要将前面的数组看成是一个已排序的数组,而且需要一个对象来暂存待排数据,所以在对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+" ");
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值