首页 > 代码库 > 算法大神之路----排序(选择排序法)

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序.

选择排序法有两种方式

  • 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置
  • 如果由小到大排序,那么就将最小值放到第一个位置

以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描.

方法分析

  • 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此,次数为n(n-1)/2次,时间复杂度为O(n2).
  • 由于选择排序是以最大或者最小值直接与未排序的数据进行比较以及交换,数据排列很有可能被改变,故选择排序法不是一个稳定的排序法
  • 空间复杂度最佳,只需要一个额外的空间

综合以上的情况,选择排序法,适用于数据量小,或者有部分数据以及排过序的情况.

代码示例(由小到大排序)

import java.util.Random;

/**
 * 算法大神之路----排序(选择排序法)
 */
public class Study02 {

    public static void main(String[] args) {

        //新建一个数组
        int[] arr = new int[6];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        //使用随机数给数组赋值
            arr[i] = r.nextInt(50);
        }
        System.out.print("原数组为:");
        paint(arr);
        System.out.println("-----排序-----");

        //选择排序法对数据进行排序
        for (int i = 0; i <arr.length; i++) {
            System.out.print("第"+(i+1)+"次扫描");
            for (int j = i+1; j < arr.length; j++) {

                if (arr[j]>=arr[i]) {
                    //拿最前端数据依次同其他数据比较,当其他数据比最前端大的时候,那么不变
                }else{
                    //当其他数据比第一个数据小的时候.交换位置
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
            paint(arr);
        }


    }

    //将数组数据打印至控制台
    public static void paint(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }

}

控制台打印结果:

原数组为:29    15    2    3    37    39    
-----排序-----
第1次扫描2    29    15    3    37    39    
第2次扫描2    3    29    15    37    39    
第3次扫描2    3    15    29    37    39    
第4次扫描2    3    15    29    37    39    
第5次扫描2    3    15    29    37    39    
第6次扫描2    3    15    29    37    39

总结:选择排序法不管是否中途已经排完毕,都需要经过固定次的扫描,相对于冒泡排序法,扫描次数不能减少.

算法大神之路----排序(选择排序法)