Java常用排序算法之插入排序

插入排序(Insertion Sort):通过对未排序的数据逐个插入至已排好的数据中的合适位置。
步骤:
首先对数组的前两个数据进行从小到大排序
将第三个数据先与第二个数据比较,大就排在第三个,小就与第一个数据比,同时原第二个数据索引往后移一个;如果比第一个大就其放在第二位,比第一个小就继续往前移放在第一位,同时原第一个数据索引往后移一个。
将第四个数据按照上述规则插入到前面排好的三个数之间。
。。。
最终得到一个递增数组。
java实现代码:

public class InsertionSort {
    static final int SIZE=10;
    public static void main(String[] args) {
        int arr[]=new int[SIZE];
        for(int i=0;i<arr.length;i++){
            arr[i]=(int)(Math.random()*100);
        }
        System.out.println("排序前的数组:");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        insertionSort(arr);
        System.out.println("插入排序后的数组:");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
    private static void insertionSort(int[] arr) {
        int i,j,x;
        for(i=1;i<arr.length;i++){
            x=arr[i];//待排数据arr[i]
            j=i-1;//待排数据前一个数据arr[j]
            while(j>=0&&x<arr[j]){
                arr[j+1]=arr[j];
                j--;
            }//如果待排数据比前一个数据小,就将前一个数据后移一位,再让待排数据与更前一位数据比较
            arr[j+1]=x;//将待排数据放到合适位置
            System.out.print("第"+i+"步排序后结果为:");
            for(int y=0;y<arr.length;y++){
                System.out.print(arr[y]+" ");
            }
            System.out.println();
        }
    }

输出为:

排序前的数组:
72 16 41 24 20 19 31 2 16 22 
第1步排序后结果为:16 72 41 24 20 19 31 2 16 22 
第2步排序后结果为:16 41 72 24 20 19 31 2 16 22 
第3步排序后结果为:16 24 41 72 20 19 31 2 16 22 
第4步排序后结果为:16 20 24 41 72 19 31 2 16 22 
第5步排序后结果为:16 19 20 24 41 72 31 2 16 22 
第6步排序后结果为:16 19 20 24 31 41 72 2 16 22 
第7步排序后结果为:2 16 19 20 24 31 41 72 16 22 
第8步排序后结果为:2 16 16 19 20 24 31 41 72 22 
第9步排序后结果为:2 16 16 19 20 22 24 31 41 72 
插入排序后的数组:
2 16 16 19 20 22 24 31 41 72 

第一步用待排数据arr[1]=16与arr[0]=72比较,arr[1]<arr[0],所以,72的索引后移一位至1,数据16的索引变成0。即{16,72};
第二步用待排数据arr[2]=41先与arr[1]=72比较,arr[2] < arr[1],所以72的索引后移一位至2,即arr[2]=72;继续比较待排数据41和arr[0]=16,41>=arr[0],所以16的索引0保持不变并且数据41的索引变成1。即{16,41,72}
第三步….
第n步,用arr[n]与arr[n-1]比较,按照上述规则交换后继续与arr[n-2]比较,arr[n-3],…直至其前面的数比其小则停止比较,确定待排数据索引。
注意:待排数据的索引是在与前面的数据比较完毕后才确定的,这一点从代码中可以看到arr[j+1]=x;在此之前待排数据X在比较过程中没有赋值给其他索引。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值