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

    选择排序

    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)可以用最小堆优化,就得到了堆排序。

  • 相关阅读:
    sublime主题推荐
    安装JDK设置环境变量
    寻找灵感
    算法刷题3 PAT 1003 我要通过! (20 point(s))
    Java JDBC连接Mysql学习整理
    算法Day2-恶搞算法(网传88万代码生成)java实现
    算法刷题1:自测-1 打印沙漏 (20 point(s))
    Java I/O stream输入输出初整理
    Java this关键字初理解
    MD5加密算法
  • 原文地址:https://www.cnblogs.com/SimonZ/p/15526260.html
Copyright © 2011-2022 走看看