zoukankan      html  css  js  c++  java
  • 经典排序之选择排序

    选择排序(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²),在稳定性方面是不稳定的。

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

  • 相关阅读:
    分库分表的几种常见形式以及可能遇到的难
    一次非常有意思的 SQL 优化经历
    JavaScript 中 4 种常见的内存泄露陷阱
    专治前端焦虑的学习方案
    专治前端焦虑的学习方案
    [计算机视觉]图像直方图与直方图均衡化
    vector.erase用法注意事项
    [OPENCV]cvHoughLines2使用说明
    MarkDown教程
    GitHub用法
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8052898.html
Copyright © 2011-2022 走看看