• 经典排序之选择排序


    选择排序(SelectionSort)的算法思想:对于数组中n个待排序的元素,进行n-1次排序,每次选出待排序数据集中的最小数(或最大数),然后将选出的最小数(或最大数)与当前待排序数据集的首个数交换;以此类推,直到排序结束,整个待排序数组也成为有序数组。

    之所以称为选择排序,意为每次选出最小或最大的数,从而完成排序。

    我接下来通过代码演示:

    package 排序算法.选择排序;
    
    import java.util.Arrays;
    
    /**
     * 选择排序
     */
    public class Test {
        static int num=0;//计算排序次数
        static void selectSort(int[] arr){
            System.out.println("排序前:"+ Arrays.toString(arr));
            for(int i=0;i<arr.length-1;i++){
                int k=i;//选择最小的数放在首位
                for(int j=k+1;j<arr.length;j++){
                    if(arr[j]<arr[k]){
                        k=j;
                    }
                }
                if(i!=k){
                    int temp=arr[i];
                    arr[i]=arr[k];
                    arr[k]=temp;
                    System.out.println("第"+(++num)+"次排序:"+Arrays.toString(arr));
                }
            }
        }
        public static void main(String[] args) {
            int[] arr=new int[]{15,32,14,86,54,78,36};
            selectSort(arr);
            System.out.println("排序后:"+ Arrays.toString(arr));
        }
    }
    

     上述代码运行后的结果:  

    排序前:[15, 32, 14, 86, 54, 78, 36]
    第1次排序:[14, 32, 15, 86, 54, 78, 36]
    第2次排序:[14, 15, 32, 86, 54, 78, 36]
    第3次排序:[14, 15, 32, 36, 54, 78, 86]
    排序后:[14, 15, 32, 36, 54, 78, 86] 

    此外,再写个优化后的选择排序:

    package com.itszt.test6;
    
    import java.util.Arrays;
    /**
     * 选择排序,每次选择最小的数放在待排序部分的首位;
     * 如果放下剩余部分有序,则停止排序
     */
    public class Test3 {
        static int k=0;
        public static void main(String[] args) {
            int[] arr={15, 32, 14, 86, 54, 78, 36};
            System.out.println("排序前:"+ Arrays.toString(arr));
            selectSort(arr);
            System.out.println("排序后:"+ Arrays.toString(arr));
        }
    
        static void selectSort(int[] arr){
            boolean boo=true;//默认有序
            for(int i=0;i<arr.length-1;i++){
                int min=i;//选择最小的数放在待排序部分的首位
                for(int j=i+1;j<arr.length;j++){
                    if(arr[min]>arr[j]){
                        boo=false;//存在无序
                        min=j;
                    }
                }
                if(boo){
                    return;
                }
                if(min!=i){
                    int temp=arr[i];
                    arr[i]=arr[min];
                    arr[min]=temp;
                    System.out.println("第"+(++k)+"次排序:"+ Arrays.toString(arr));
                }
            }
        }
    }  

    最后,选择排序的平均时间复杂度为O(n²),在稳定性方面是不稳定的。

    【注:关于排序中的稳定性,请参考本博中的“经典排序之插入排序”文章】

  • 相关阅读:
    利用“通过'反射方式'创建的对象”来创建对象的性能问题?
    Linq 学习笔记(一)
    说说数据类型转换帮助类
    使用公共静态属性的方式来代替公共静态字段(C#)
    支持差异数据保存的数据库实体类设计(二)(续)
    编程杂记
    Linq 学习笔记(二)
    UI版本WinDBG常用命令
    Oracle数据库卸载
    SAS框架问世
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8052898.html
Copyright © 2020-2023  润新知