zoukankan      html  css  js  c++  java
  • java实现选择排序

    我之前已经谈到过冒泡排序,今天我们来玩玩选择排序
    那么同样的首先我们要了解什么是选择排序,选择排序就是每次选定第一个为最大值,或者最小值,如果我们要进行降序排列,那么我们就将第一个作为最大值,然后遍历整个数组,如果有比这个数还大的,就交换,然后继续遍历,那么第一轮下来我们就找到了最大的一个,那么我们将第二个作为最大值,然后依次遍历,
    这里我们可以总结一下,其实选择和冒泡排序很像,冒泡是将最小的或最大的放在了最后一个,而选择排序是放在第一个
    选择排序是从前到后排序,,,而冒泡是从后到前排序,
    那么下面我们举个例子来说明
    3,7,1,4,9降序排列
    第一轮将第一个数作为最大值:后面如果有比3还大的就交换
    7,3,1,4,9—-》9,3,1,4,7
    经过第一轮我们就找到了最大值
    第二轮将第二个数作为最大值:3
    9,3,1,4,7–》9,4,1,3,7—》9,7,1,3,4
    经过第二轮我们就找到了第二大的
    下面我们将第三个作为最大值1
    9,7,1,3,4—》9,7,3,1,4—》9,7,4,1,3
    那么下面我们用代码实现】

    //定义一个数组
            int[] num = new int[]{2,3,4};
            //利用选择排序降序排列
            int max = num[0];
            int temp;
            for(int i=1;i<num.length;i++){
                if(max<num[i]){
                    temp=max;
                    max=num[i];
                    num[i]=temp;
                }
            }
            for(int i=0;i<num.length;i++){
                System.out.print(num[i]);
            }
    
    //定义一个数组
            int[] num = new int[]{2,3,4};
            //利用选择排序降序排列
            int max = num[0];
            //这里第一轮就错了
            //不能将第一个数直接作为最大值
            //而是将第一数的下标0作为最大值
            //然后交换的是num[0]和num[i]
            //因为比如如果我max=num[0],然后和num[1]小,将max和num[1]交换
            //但是num[0]还是2,然后num[1]变成了2,最后的结果是{2,2,3}
            //所以结果会变成2,2,3
            //所以一定注意,再选择排序中交换的数组中的两个值,而这里的max或者min
            //只是我们当作最大值的下标      
            int temp;
            for(int i=1;i<num.length;i++){
                if(max<num[i]){
                    temp=max;
                    max=num[i];
                    num[i]=temp;
                }
            }
            for(int i=0;i<num.length;i++){
                System.out.print(num[i]);
            }
    //定义一个数组,进行升序排列
            int[] num = new int[]{9,8,7,6,5,4,3,2};
            for(int i:num){
                System.out.print(i+" ");
            }
            System.out.println("
    ");
            //利用选择排序
            //将第一个数作为最小值
            //MinIndex=0
            int MinIndex = 0;
            int temp;
            for(int i = 1;i<num.length;i++){
                if(num[MinIndex]>num[i]){
                    temp = num[MinIndex];
                    num[MinIndex] = num[i];
                    num[i] = temp;
                    MinIndex = i;
                }
            }
            for(int i:num){
                System.out.print(i+" ");
                }
    9 8 7 6 5 4 3 2 
    
    8 7 6 5 4 3 2 9 

    通过第一轮我们可以看到已经选出了最大值,并且放在最后面,那么下面我们只需要遍历前面7个数就行了,然后再将第二个数8作为最大值,依次遍历,那么内层循环每次就应该少一次

    //定义一个数组,进行升序排列
            int[] num = new int[]{5,4,3,2,1};
            for(int i:num){
                System.out.print(i+" ");
            }
            System.out.println("
    ");
            //利用选择排序
            //将第一个数作为最小值
            //MinIndex=0
            //int MinIndex = 0;
            int temp;
            int count=0;
            for(int j=0;j<num.length-1;j++){
                int MaxIndex = j;
                for(int i = j+1;i<num.length;i++){
                    if(num[MaxIndex]<num[i]){//如果有比最大值还大的就改变最大值的下标,继续向后遍历
                        MaxIndex = i;
                    }else{
                    temp = num[MaxIndex];//如果下一个小于最大值,就互相交换,最后的目的就是将最大值放在最后面去
                    num[MaxIndex] = num[i];
                    num[i] = temp;
                    //这里的交换不能放在if语句里面,是不满足if语句才交换,满足if语句直接改变最大值的下标就行了
                    }
                }
                count++;
                System.out.print("第"+count+"次: ");
                for(int i:num){
                    System.out.print(i+" ");
                }
                System.out.println("
    ");
            }
    
            for(int i:num){
                System.out.print(i+" ");
                }
                5 4 3 2 11次: 1 5 4 3 22次: 1 2 5 4 33次: 1 2 3 5 44次: 1 2 3 4 5 
    
    1 2 3 4 5 
    这里的外层循环只需要4次就行了,也就是最后一个不需要再进行比较了,我们同样可以将每次的比较结果打印出来,就可以知道了
    欢迎关注我的公众号:小秋的博客 CSDN博客:https://blog.csdn.net/xiaoqiu_cr github:https://github.com/crr121 联系邮箱:rongchen633@gmail.com 有什么问题可以给我留言噢~
  • 相关阅读:
    网站数据库
    提笔不知道说啥
    预祝大家新年快乐
    又..
    明日出发
    吸气呼气
    网吧
    光阴似箭
    <转>生活中的各种食品安全问题
    老了吗?
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10428318.html
Copyright © 2011-2022 走看看