首页 > 代码库 > 选择排序

选择排序

思路:固定数组中的一个位置,将数组其他位置上的元素依次与该(固定住的)位置上的元素进行比较,若比该位置上的元素小(或大),则交换两数,经过第一轮比较,就可以排出一个最小(或最大)的数;然后该位置下移,将剩下的数据再按照第一步不停的与固定住的元素进行比较,交换,最终就可以完成有序排列.

附上代码:

package cn.qujianlei.easy;

public class SelectionSortDemo {
    
    public static void selectSort(int...a){
        for(int i=0;i<a.length-1;i++){
            for(int j=i+1;j<a.length;j++){
                if(a[i]>a[j]){//按照递增的顺序
                    a[i]=a[i]^a[j];//这里用异或的方式进行两数的交换
                    a[j]=a[i]^a[j];//原理:一个数异或另一个数两次仍然是原数
                    a[i]=a[i]^a[j];//例:a^b^b=a
                }
                System.out.print("      第"+i+"步"+"("+j+")"+"分步排序结果:");
                for (int m = 0; m < a.length; m++) {
                    System.out.print(" "+a[m]);
                }
                System.out.println();
            }
            System.out.print("第"+i+"步排序结果:");
            for (int k = 0; k < a.length; k++) {
                System.out.print(" "+a[k]);
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        int[]shuzu=new int[10];
        for (int i = 0; i < shuzu.length; i++) {
            shuzu[i]=(int)(Math.random()*101+100);//用Math的随机函数方法初始化数组,随机出来的数的范围是100~201的int型数
        }
        System.out.println("排序前的数组为:");
        for (int i = 0; i < shuzu.length; i++) {
            System.out.print(shuzu[i]+" ");
        }
        System.out.println();
        selectSort(shuzu);
        System.out.println("排序后的数组为:");
        for (int i = 0; i < shuzu.length; i++) {
            System.out.print(shuzu[i]+" ");
        }
        System.out.println();
    }
}

运行结果:

排序前的数组为:
149 136 148 107 134 102 134 114 133 186
第0步(1)分步排序结果: 136 149 148 107 134 102 134 114 133 186
第0步(2)分步排序结果: 136 149 148 107 134 102 134 114 133 186
第0步(3)分步排序结果: 107 149 148 136 134 102 134 114 133 186
第0步(4)分步排序结果: 107 149 148 136 134 102 134 114 133 186
第0步(5)分步排序结果: 102 149 148 136 134 107 134 114 133 186
第0步(6)分步排序结果: 102 149 148 136 134 107 134 114 133 186
第0步(7)分步排序结果: 102 149 148 136 134 107 134 114 133 186
第0步(8)分步排序结果: 102 149 148 136 134 107 134 114 133 186
第0步(9)分步排序结果: 102 149 148 136 134 107 134 114 133 186
          第0步排序结果: 102 149 148 136 134 107 134 114 133 186
第1步(2)分步排序结果: 102 148 149 136 134 107 134 114 133 186
第1步(3)分步排序结果: 102 136 149 148 134 107 134 114 133 186
第1步(4)分步排序结果: 102 134 149 148 136 107 134 114 133 186
第1步(5)分步排序结果: 102 107 149 148 136 134 134 114 133 186
第1步(6)分步排序结果: 102 107 149 148 136 134 134 114 133 186
第1步(7)分步排序结果: 102 107 149 148 136 134 134 114 133 186
第1步(8)分步排序结果: 102 107 149 148 136 134 134 114 133 186
第1步(9)分步排序结果: 102 107 149 148 136 134 134 114 133 186
          第1步排序结果: 102 107 149 148 136 134 134 114 133 186
第2步(3)分步排序结果: 102 107 148 149 136 134 134 114 133 186
第2步(4)分步排序结果: 102 107 136 149 148 134 134 114 133 186
第2步(5)分步排序结果: 102 107 134 149 148 136 134 114 133 186
第2步(6)分步排序结果: 102 107 134 149 148 136 134 114 133 186
第2步(7)分步排序结果: 102 107 114 149 148 136 134 134 133 186
第2步(8)分步排序结果: 102 107 114 149 148 136 134 134 133 186
第2步(9)分步排序结果: 102 107 114 149 148 136 134 134 133 186
          第2步排序结果: 102 107 114 149 148 136 134 134 133 186
第3步(4)分步排序结果: 102 107 114 148 149 136 134 134 133 186
第3步(5)分步排序结果: 102 107 114 136 149 148 134 134 133 186
第3步(6)分步排序结果: 102 107 114 134 149 148 136 134 133 186
第3步(7)分步排序结果: 102 107 114 134 149 148 136 134 133 186
第3步(8)分步排序结果: 102 107 114 133 149 148 136 134 134 186
第3步(9)分步排序结果: 102 107 114 133 149 148 136 134 134 186
          第3步排序结果: 102 107 114 133 149 148 136 134 134 186
第4步(5)分步排序结果: 102 107 114 133 148 149 136 134 134 186
第4步(6)分步排序结果: 102 107 114 133 136 149 148 134 134 186
第4步(7)分步排序结果: 102 107 114 133 134 149 148 136 134 186
第4步(8)分步排序结果: 102 107 114 133 134 149 148 136 134 186
第4步(9)分步排序结果: 102 107 114 133 134 149 148 136 134 186
          第4步排序结果: 102 107 114 133 134 149 148 136 134 186
第5步(6)分步排序结果: 102 107 114 133 134 148 149 136 134 186
第5步(7)分步排序结果: 102 107 114 133 134 136 149 148 134 186
第5步(8)分步排序结果: 102 107 114 133 134 134 149 148 136 186
第5步(9)分步排序结果: 102 107 114 133 134 134 149 148 136 186
          第5步排序结果: 102 107 114 133 134 134 149 148 136 186
第6步(7)分步排序结果: 102 107 114 133 134 134 148 149 136 186
第6步(8)分步排序结果: 102 107 114 133 134 134 136 149 148 186
第6步(9)分步排序结果: 102 107 114 133 134 134 136 149 148 186
          第6步排序结果: 102 107 114 133 134 134 136 149 148 186
第7步(8)分步排序结果: 102 107 114 133 134 134 136 148 149 186
第7步(9)分步排序结果: 102 107 114 133 134 134 136 148 149 186
          第7步排序结果: 102 107 114 133 134 134 136 148 149 186
第8步(9)分步排序结果: 102 107 114 133 134 134 136 148 149 186
          第8步排序结果: 102 107 114 133 134 134 136 148 149 186
排序后的数组为:
102 107 114 133 134 134 136 148 149 186

注:括号内的数任然是内层循环。

附上图解:

技术分享

简单点说就是每次都定住一个数,将它与其他的数进行比较,比它小就交换,不小就继续比较下一个,与其他数比较完了之后,换下一个数接着定,接着比,交换,循环...

 

选择排序