【小白学算法】12. 排序算法-选择排序

简介: 【小白学算法】12. 排序算法-选择排序

选择排序(Selection sort)是一种简单直观的排序算法。


它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。


比如说现在有个数组[6,3,5,7,0],对其从小到大进行排序,那么选择排序的过程应该是这样的:


1268169-20210504224441667-796494851.png


从这个过程中可以看出选择排序的一些规则:


  • 选择排序一共有 数组大小-1轮。
  • 而在每一轮的排序中,又会有一个小循环,规则是:
  1. 先假定当前的这个数是最小的。
  2. 然后与后面的每个数进行比较,如果发现有更小的数,重新确定最小的数,并得到这个数的下标。
  3. 继续遍历到数组最后,于是确定出本轮的最小数以及它的下标。
  4. 进行位置交换


推导过程的代码


将数组[101,34,119,1]从小到大进行排序。


package sort;
import java.util.Arrays;
public class SelectSorting {
    public static void main(String[] args) {
        int [] arr = {101,34,119,1};
        selectSort(arr);
    }
    // 选择排序
    public static void selectSort(int[] arr) {
        // 原始数组[101,34,119,1]
        // 第一轮排序
        int minIndex = 0;
        int min = arr[0]; //假定第一个元素就是最小值
        for (int j = 0 + 1; j < arr.length; j++) {
            if (min > arr[j]) {  // 比较,如果是true,那么说明min不是最小值
                min = arr[j];  // 重置最小值
                minIndex = j;  // 重置minIndex
            }
        }
        // 最小值与arr[0]交换位置
        if (minIndex != 0) {  // 优化点:如果第一个用于比较的元素就是最小值,就不用交换位置
            arr[minIndex] = arr[0];
            arr[0] = min;
        }
        System.out.println("第一轮之后:");
        System.out.println(Arrays.toString(arr));  // 第一轮之后 [1, 34, 119, 101]
        // 第二轮排序
        minIndex = 1;
        min = arr[1]; //假定第二个元素就是最小值
        for (int j = 1 + 1; j < arr.length; j++) {
            if (min > arr[j]) {  // 比较,如果是true,那么说明min不是最小值
                min = arr[j];  // 重置最小值
                minIndex = j;  // 重置minIndex
            }
        }
        // 最小值与arr[1]交换位置
        if (minIndex != 1) {
            arr[minIndex] = arr[1];
            arr[1] = min;
        }
        System.out.println("第二轮之后:");
        System.out.println(Arrays.toString(arr));  // 第二轮之后 [1, 34, 119, 101]
        // 第三轮排序
        minIndex = 2;
        min = arr[2]; //假定第三个元素就是最小值
        for (int j = 2 + 1; j < arr.length; j++) {
            if (min > arr[j]) {  // 比较,如果是true,那么说明min不是最小值
                min = arr[j];  // 重置最小值
                minIndex = j;  // 重置minIndex
            }
        }
        // 最小值与arr[2]交换位置
        if (minIndex != 2) {
            arr[minIndex] = arr[2];
            arr[2] = min;
        }
        System.out.println("第三轮之后:");
        System.out.println(Arrays.toString(arr));  // 第三轮之后 [1, 34, 101, 119]
    }
}


根据推导过程发现的规律,转化成最终的代码:


package sort;
import java.util.Arrays;
public class SelectSorting {
    public static void main(String[] args) {
        int [] arr = {101,34,119,1};
        selectSort(arr);
        System.out.println("排序后:");
        System.out.println(Arrays.toString(arr));
    }
    // 选择排序
    public static void selectSort(int[] arr) {
        // 原始数组[101,34,119,1]
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            int min = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
                if (min > arr[j]) {  // 比较,如果是true,那么说明min不是最小值
                    min = arr[j];  // 重置最小值
                    minIndex = j;  // 重置minIndex
                }
            }
            if (minIndex != i) {  // 优化点:如果第一个用于比较的元素就是最小值,就不用交换位置
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
        }
    }
}


如果要从大到小进行排序,很简单,只要改动这里即可:


......
                if (min < arr[j]) {  // 大于号改成小于号
                    min = arr[j];  
                    minIndex = j;  
                }
......


从过程推导再到最后形态,还是比上来直接看2层for循环要好理解的多了。

相关文章
|
7月前
|
算法 搜索推荐 测试技术
【调度算法】快速非支配排序算法
【调度算法】快速非支配排序算法
62 3
|
3月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
51 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
3月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
39 0
数据结构与算法学习十四:常用排序算法总结和对比
|
3月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
25 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
3月前
|
搜索推荐 Java Go
深入了解选择排序算法
深入了解选择排序算法
33 4
|
3月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
3月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
3月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
37 0
|
5月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
7月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**

热门文章

最新文章