• 选择排序


    选择排序

    img

    步骤

    选择排序思路特别简单:选择n个数里最小的那个数,交换它和第1个数的位置。在剩下的数字列表里选择最小的数,交换它和第2个数的位置。总之就是每一轮找到最小的数的坐标,交换到相应的位置。

    伪代码:

    void Selection_Sort(ElementType A[],int N) {
        for(i = 0;i < N;i++) {
            MinPosition = ScanForMin(A,i,N-1);
            // 从A[i]到A[N-1]中找到最小的元,并将其位置赋给MinPosition
            Swap(A[i],A[MinPosition]);
            // 将未排序部分的最小元换到有序部分的最后位置
        }
    }
    

    Java代码实现

    public void sort(int[] arr) {
    	// 总共经过n-1轮比较,最后第n轮就已经排好序了
        for (int i = 0; i < arr.length; i++) {
            // 最小元素的坐标
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                // 找到目前能找到的最小的记录
                if (this.less(arr[j], arr[minIndex])) {
                    minIndex = j;
                }
            }
            // 交换记录
            if (minIndex != i) {
                this.exchange(arr, minIndex, i);
            }
        }
    }
    

    时间复杂度

    交换部分最差的情况就是每次都交换,最多交换n-1次,因为最后一次交换肯定是能使两个数都归位的。

    找最小元素坐标的部分,每次都要把数组除有序部分都扫描一遍,所以整个时间复杂度是O(n^2)。

    ScanForMin(A,i,N-1)可以用最小堆优化,就得到了堆排序。

  • 相关阅读:
    [Linux]软件目录
    [Linux]查看Linux内核及发行版本
    [S7706]华为ACL
    [S7706]华为配置DHCP
    QML-密码管理器
    QML-AES加解密小工具
    LaTex中文article模板(支持代码、数学、TikZ)
    Memo-Tech
    VIM学习笔记
    CodeForces 674C Levels and Regions
  • 原文地址:https://www.cnblogs.com/SimonZ/p/15526260.html
Copyright © 2020-2023  润新知