zoukankan      html  css  js  c++  java
  • 数据结构与算法之排序算法(三):选择排序

    选择排序可以分为:简单选择排序和堆排序(已知位置,找元素)
    1.简单选择排序

    原理:就是直接从待排序数组里选择一个最小(最大)的数字,顺序放入数组里,直到数组排好序

    代码实现:
    for(int i=0;i<a.length-1;i++){
        int smallest = i;
        for(int j=i+1;j<a.length;j++){
            if(a[j] < a[smallest]){
                smallest = j;
            }
        }
        if(smallest != i){
            a[i] = a[i] ^ a[smallest];
            a[smallest] = a[i] ^ a[smallest];
            a[i] = a[i] ^ a[smallest];
        }
    }

    分析:算法不稳定(比如:5,2,5,1.第一个5会和1交换),空间复杂度O(1),时间复杂度【最佳,平均和最差O(n*n)】


    2.堆排序(简单选择排序的改进)

    原理:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是讲其与堆数组中的末尾元素交换,此时末尾元素就是最大值),然后将剩余n-1个序列重新构成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了。

    代码实现:
    void heapSort(array[] a){
        将数组向后移动一位,使得元素序号从1开始
        int[] arr = new int[a.length + 1];
        for (int i = 0; i < a.length; i++ ){
                arr[i+1] = a[i];
            }
        //先将排序的序列构建成一个大顶堆
        forint i = a.length / 2; i > 0; i--){
            heapAdjust(arr, i, a.length);
        }
        //排序
        for(int j = a.length; j > 1; j--){
            swap(arr,1,j);//将堆顶元素和当前未经排序的子序列的最后一个元素交换
            heapAdjust(arr,1,j-1);//将剩下n-1个序列重新构建成大顶堆
        }
        //将排好序的序列复制到原数组
        for (int i = 0; i < a.length; i++ ){
                  a[i] = arr[i+1];
            }
    }
    void heapAdjust(array[] a, int i, int n){
        int tmp = a[i];//将待调整序列的根节点临时存储
        for(int j = 2 * i; j <= n; j *= 2){//对元素较大的孩子节点向下筛选
            if(j < n && a[j] < a[j+1]){//将j指向元素较大的孩子
                ++j;
            }
            if(tmp <= a[j]){//如果根节点小于孩子中最大的元素,则将孩子中最大的元素赋值给根节点
                a[i] = a[j];
            }else{break;}
            i = j;//将j作为根节点,继续调整它的子节点
        }
        a[i] = tmp;//将根节点的值赋值给调整后的子节点
    }

    分析:不稳定,空间代价O(1),时间复杂度【最好、平均、最差均为nlogn】 优点:由于构建堆花的时间比较多,所以适应于大数据量排序

  • 相关阅读:
    【Luogu1095】守望者的逃离
    python基础学习1-类相关内置函数
    python基础学习1-面向对象
    python基础学习1 -异常捕获
    python基础学习1-类,对象
    python基础学习1-正则表达式
    python基础学习1-反射
    python基础学习1-日志信息
    python基础学习1-生成器,递归函数
    python基础学习1-json,pickle的序列化和反序列化
  • 原文地址:https://www.cnblogs.com/small-boy/p/8039052.html
Copyright © 2011-2022 走看看