冒泡排序、插入排序、选择排序

以下所说排序都是从小到大的排序。
冒泡排序:从第一个数开始,每相邻两个数进行比较,将大的数放在后面;经过一次遍历比较,就会发现最大的数在整个数组中的最后面;然后再将剩下的数(不包括最后位置最大的那个数)再进行一次这样的遍历比较,从第一个数开始,每相邻两个数进行比较,就会发现剩下的数中的最大的数,会跑到整个数组中的倒数第二个位置;以此循环遍历。
如图:
在这里插入图片描述

 private static void bubbleSort(int[] array){
        //将最大的数往后冒
        //外层循环控制循环的次数
        for (int i=0;i<array.length;i++){
            //内层循环,每两个相邻的数进行比较
            for(int j=0;j<array.length-1;j++){
                //如果前面的数大于后面的数,就进行交换
                if(array[j]>array[j+1]){
                    //交换位置
                    int t=array[j];
                    array[j]=array[j+1];
                    array[j+1]=t;
                }
            }
        }
    }

插入排序:将一个数插入到有序部分中,将这个数与有序部分中的数依次从后面开始进行比较,找到其合适的位置进行插入。

 private static void insertSort1(int[] array){
        //将一个数插入到有序部分中
        //有序部分[0,i) 无序部[i,array.length)
        for(int i=0;i<array.length;i++){
            //将要插入的数array[i]与有序部分中的数依次从后面进行比较,看其应该插在哪里
            int j;
            for( j=i-1;j>=0;j--){
                if(array[j]<array[i]){
                    //array[j]<array[i] 说明array[i]所在的位置就是正确的,也不用再与前面的数进行比较了
                   break;
                }
            }
            //一直到array[i]不小于array[j]了,将(j,i)中间的数后移,然后将array[i]换到array[j]位置的后一个位置array[j+1]处,
            int t=array[i];
            int k;
            //将(j,i)中间的数后移
            for( k=i-1;k>j;k--){
                array[k+1]=array[k];
            }
            array[k+1]=t;
        }
    }

或者另一种写法:

 //边找边插入
    private static void insertSort2(int[] array){
        for(int i=0;i<array.length;i++){
            //将要插入的数与有序部分中的数依次从后面进行比较,看其应该插在哪里
            int j;
            int t=array[i];
            for( j=i-1;j>=0;j--){
                if(array[j]<t){
                    //array[j]<array[i] 说明array[i]所在的位置就是正确的,也不用再与前面的数进行比较了
                    break;
                }else{
                    //将前一个数后移
                    array[j+1]=array[j];
                }
            }
            array[j+1]=t;
        }

    }

选择排序:从无序部分中找出最大的一个数,将其放在无序部分的最后一个位置(即 将最大的那个数与最后一个数互换位置),则无序部分长度减1;下一次,再从无序部分中找出最大的一个数放在无序部分的最后,无序部分长度再减1;以此循环。

 private static void selectSort(int[] array){

        //从无序的所有的数里面选择一个最大的数放在无序部分中最后一个位置
        //无序部分[0,array.length-i)  有序部分[array.length-i,array.length)
        for(int i=0;i<array.length;i++){
            int max=0;
            for(int j=1;j<array.length-i;j++){
                if(array[j]>array[max]){
                    max=j;//通过内部循环,找出最大的数的坐标
                }
            }
            //将最大的数放在数组中无序部分的的最后一个位置
            //即 无序部分中将最大的数与最后一个数互换位置
            int t=array[array.length-i-1];
            array[array.length-i-1]=array[max];
            array[max]=t;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值