java 排序(冒泡、选择、插入)

1)冒泡排序:

   (  时间复杂度 O(n^2)  )

     长度为len的序列,一共进行(len-1)趟排序 ,每趟排序,两两比较相邻元素的值,如果发现逆序则进行交换。

     其中,每趟排序 a都要进行(len-1)次比较;b都能确定一个最大值;

public static void bubbleSort(int[] arr){//静态方法访问
        int count=0;
        boolean flag=false;
        for(int k=0;k<arr.length;k++){
            for(int i=0;i<arr.length-1-k;i++){
                int temp;
                if (arr[i]>arr[i+1]){
                    flag=true;
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            if (!flag){
                break;
            }else{
                flag=false;//重置flag
            }
            count++;
        }
    }

2)选择排序:

   时间复杂度 O(n^2),但方法优于选择排序

 

说明:

1.选择排序一共有(arr.length-1)轮排序, 第i轮排序需要遍历从 i+1到 arr.length-1 的值

2.每一轮排序,又是一个循环,循环的规则(代码)

   2.1 先假定当前这个数是最小数,将其值赋给变量min,其索引赋值给变量minIndex

   2.2 将min与循环中的所有的值比较,如果找到比min小的,就重新给min和minIndex赋值,

   2.3 当追历到数组的最后时,就得到本轮最小数和下标

3.根据索引交换[代码中再继续说〕

   这边有一个优化,即找到的值的索引与假定的最小值的索引不相等时,才需要交换两个值的位置。

    public static void selectSorting(int[] arr){
        for(int i=0;i<arr.length-1;i++) {
            int minIndex=i;
            int min = arr[i];
            for (int j = i+1; j < arr.length; j++) {
                if (min > arr[j]) { //改成逆序只需改这边
                    min = arr[j];
                    minIndex = j;

                }
            }
            if(minIndex != i){
                arr[minIndex]=arr[i];
                arr[i] = min ;
            }
        }
    }

 3)插入排序:

 

比冒泡和选择都要快;

   长度为len的序列,一共要进行len-1轮

   第i轮能确定i+1个有序数列,即每一轮将第i+2个值正确插入到前面已确定的有序序列中。

   方法:

  1)将待插入的值赋值给一个变量insertValue

       将待插入的前一个值的索引赋给 insertIndex

  2)进行循环,每一次循环,将待插入的值与 arr[insertIndex](即索引为insertIndex的值)比较,

      如果不满足(insertValue < arr[insertIndex])这个关系,则将arr[insertIndex]后移一位,继续循环。

  3)当跳出循环,即代表找到了要插入值的索引,将insertValue的值赋给这个索引的值即可。

       重点步骤在于找到待插入数据的位置。

    public static void insertSorting(int[] arr){
        //给insertValue找到待插入位置
        for(int i=0;i<arr.length-1;i++) {
            int insertValue = arr[i+1];
            int insertIndex = i;//待插入值的前一个位置的索引
            //将arr[insertIndex]后移
            while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex--;
            }
            //当推出while循环时,代表插入位置找到,insertIndex+1
            arr[insertIndex+1]=insertValue;
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值