• 选择排序


    基本介绍

    选择排序也属于内部排序算法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的

    选择排序的思想

    选择排序(select sorting)也是一种简单的排序算法.它的基本思想是:

    • 第一次从arr[0]~arr[n-1]中选取最小值,与arr[0] 进行交换;
    • 第二次总arr[1]~arr[n-1]中选取最小值,与arr[1]进行交换;
    • 第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]进行交换;
    • 第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]进行交换;
    • .
    • .
    • .
    • 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]进行交换;

    分析图


    代码实现

    分趟直观显示

    public class SelectSort {
        public static void main(String[] args) {
            int[] arr = {101,34,119,1};
            System.out.println("原始数据为:");
            System.out.println(Arrays.toString(arr));
    
            //先假定第一个元素是最小的,然后进行比较
            int minIndex = 0;
            int min = arr[0];
            //第一趟
            for (int j = 1; j <arr.length ; j++) {
                if (arr[j] < min){ //后面的元素比最小值小,则交换
                    min = arr[j];
                    minIndex = j;
                }
            }
            //交换
            arr[minIndex] = arr[0];
            arr[0] = min;
            System.out.println("第一趟:");
            System.out.println(Arrays.toString(arr));
    
            //第二趟
            minIndex = 1;
            min = arr[1];
            for (int j = 1+1; j <arr.length ; j++) {
                if (arr[j] < min){ //后面的元素比最小值小,则交换
                    min = arr[j];
                    minIndex = j;
                }
            }
            //交换
            arr[minIndex] = arr[1];
            arr[1] = min;
            System.out.println("第二趟:");
            System.out.println(Arrays.toString(arr));
    
            //第三趟
            minIndex = 2;
            min = arr[2];
            for (int j = 1+2; j <arr.length ; j++) {
                if (arr[j] < min){ //后面的元素比最小值小,则交换
                    min = arr[j];
                    minIndex = j;
                }
            }
            //交换
            arr[minIndex] = arr[2];
            arr[2] = min;
            System.out.println("第三趟:");
            System.out.println(Arrays.toString(arr));
        }
    }
    
    原始数据为:
    [101, 34, 119, 1]
    第一趟:
    [1, 34, 119, 101]
    第二趟:
    [1, 34, 119, 101]
    第三趟:
    [1, 34, 101, 119]
    

    上面使用分趟的方式完成了选择排序,非常直观,但是同样和上一节的冒泡排序(分趟)存在一样的问题,数组特别大,不可能这样手动分趟,所以观察上面代码,不难发现规律

    双重for代码

    public class SelectSort {
        public static void main(String[] args) {
            int[] arr = {101,34,119,1};
            System.out.println("原始数据为:");
            System.out.println(Arrays.toString(arr));
            selectSort(arr);
        }
    
        private static void selectSort(int[] arr) {
            for (int i = 0; i < arr.length-1; i++) {
                //设置哨兵
                int min = arr[i];
                int minIndex = i;
                for (int j = i+1; j < arr.length; j++) {
                    if (arr[j] < min){ // 交换最小值
                        min = arr[j];
                        minIndex = j;
                    }
                }
                //交换 需要注意,minIndex = i,是不需要交换的,因为最小值就是本身
                if (minIndex != i) {
                    arr[minIndex] = arr[i];
                    arr[i] = min;
                }
                System.out.printf("第%d趟后的结果为
    ",i+1);
                System.out.println(Arrays.toString(arr));
            }
        }
    }
    
    原始数据为:
    [101, 34, 119, 1]
    第1趟后的结果为
    [1, 34, 119, 101]
    第2趟后的结果为
    [1, 34, 119, 101]
    第3趟后的结果为
    [1, 34, 101, 119]
    
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13810134.html
Copyright © 2020-2023  润新知