排序算法---选择排序,冒泡排序,拆入排序

1.选择排序 
对比0~n-1
通过比较值 将值小的放0位
对比1~n-1
通过比较值 将值小的放1位
以此类推
......
对比n-2~n-1
通过比较值 将值小的放n-2位
2.冒泡排序
对比0~n-1
0 1 位置进行对比  值大的 往后
然后1 2 进行对比 值大的放2
两两对比值大的 放后面 最终 n-1的值是最大的
以此类推
....
....

3.插入排序

下标:0-0  有序
下标:0-1 有序 对比大小 小的往前
下标:0-2 有序对比大小  小的往前
下标:0-3 有序对比大小  小的往前
.....
以此类推


 int num[]={1,9,6,7,5,8,4};
       
    //1.拆入排序:0-0 位置有序   0-1有序 0-2位置有序  0-3位置有序
    //i=1  m=0  1与9 比较 9大  不交换了 m--=-1 跳出
    //i=2  m=1  9与6比较  9大  交换位置 1 6 9 m-- =0 继续 然后0跟1 比较 1 跟 6比较 6大 不处理 跳出 结果是1697584
    //i=3  m=2  9与7比较  9大 交换位置 167 9  m--=1  继续 6vs7 小于 不处理 继续 m--=0 1vs6 小于不处理 1679584
    //i=4  m=3  9vs5 9大 交换  1675984 m--=2  7vs5 交换 1657984 m--=1 6vs5 交换 1567984 m--=0 1vs5 不处理跳出
    //i=5  m=4  9vs8 9大 交换 1567894 m--=3  7vs8 小于不交换 我感觉此时就没必要在往前判断了 因为前面已经排序好了 但是我们程序还会m-- 然后在判断一次。是否可以省略?
    //i=6 m=5  9vs4 9大 交换  1567849 m--=4  8vs4 交换 1567489 m--=3 7vs4 交换 1564789 m--=2 6vs4 交换 1546789 m--=1 5vs4 交换 1456789 m--=0 1vs4 不交换结束
    void insertSort(int [] num){
        for(int i=1;i<num.length;i++){
            for(int m=i-1;m>=0;m--){
                if(num[m]>num[m+1]) {
                    int tem = num[m + 1];
                    num[m + 1] = num[m];
                    num[m] = tem;
                }else{
                    break;
                }
            }
        }
        for(int sortNum:num){
            System.out.print(sortNum+" ");
        }
    }

   // int num[]={1,9,6,7,5,8,4};
    //2.冒泡排序 : 对比0~n-1 0 1 位置进行对比  值大的 往后 然后1 2 进行对比 值大的放2 两两对比值大的 放后面 最终 n-1的值是最大的
    //i=6  j=1  拿j-1 与 j 进行对比  1比9小  不替换位置
    //在循环 拿 9 与6 比较  9大 替换位置   在循环 拿9与7 比较 9大 替换位置  在++ 拿9与5比较  9大 替换位置.... 9与4比较 9大 替换位置 1675849
    //第二个外循环 i=5了 因为这个 num[6]=9 最大了 拿着1675849 在循环比较 j<=i 所以9 是不会读到了
    //1与6比较 6大 不动   6与7比较 7大 不动 7与5比较 7大 替换位置  7与8比较 8大不动 8与4 比较 8大 替换位置 得到结果1657489
    void bubbleSort(int [] num){
        for(int i=num.length-1;i>=0;i--){
            for(int j=1;j<=i;j++){
                if(num[j-1]>num[j]){
                    int tem=num[j-1];
                    num[j-1]=num[j];
                    num[j]=tem;
                }
            }
            for(int sortNum:num){
                System.out.print(sortNum+" ");
            }
            System.out.println();
        }
        for(int sortNum:num){
            System.out.print(sortNum+" ");
        }
    }

    //3.选择排序:  遍历数组最小的 放0  然后在遍历数组 最小的放1 .。。。最小的放n-1
// int num[]={6,7,5,8,4};
    void chooseSort(int [] num){
        //i=0  6  7 比较  6小  6跟5比  5小下标就是5 5跟8比较  还是5  5跟4比较 4小 返回4的下标  然后4的下标跟当前这6的下标换位置
        //那就变成了4 7 5 8 6
        //这时候 i=1  7 跟5比较  5小  5跟8比较 5小  5 跟6比较5 小 那5跟7 换位置
        //变成了 4 5 7 8 6
        //这时候 i=2   7跟8比较 7小 7跟6比较 6小  6跟7换位置
        //这时候变成了45687
        //这时候 i=3  8跟7比较 7小  7 跟 8换位置
        //这时候变成了45678
        //这时候 i=4  8每人比较 又执行了换位置 自己跟自己换
        for(int i=0;i<num.length;i++){
             int minIndex=i;
            for(int m=i+1;m<num.length;m++){
                int secondNum=num[m];
                minIndex=secondNum<num[minIndex]?m:minIndex;
            }
            int temp=num[minIndex];
            num[minIndex]=num[i];
            num[i]=temp;
        }
        for(int sortNum:num){
            System.out.print(sortNum+" ");
        }
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值