• 数据结构与算法之选择排序


      每次 从待排序序列中选择出一个最大(或者最小)的记录添加到有序序列的后面即为选择排序。

      选择排序主要有:简单选择排序树形选择排序堆排序

    1、简单选择排序

     基本思路:重复进行n趟选择,第i趟通过n-i次记录的比较,在n-i+1个记录中选取最小(或最大)的记录与第i个记录进行交换。

    void selectSort(int arr[],int n){
        int outer,inner;
        int min;
        for(outer=1;outer<=n;outer++ ){
            min = outer;
            for(inner=outer;inner<=n;inner++)
              if(arr[inner]<arr[min])
                min = inner;
            if(min != outer){
                arr[0] = arr[min];
                arr[min] = arr[outer];
                arr[outer] = arr[0];
            }
    
        }
    }

    2、堆排序

     堆:(1) 堆是完全二叉树;

      (2) 小根堆:每个结点的值小于等于左右孩子结点的值;大根堆:每个结点的值大于等于左右孩子结点的值。

    堆排序:对于大根堆来说,堆顶记录即是整个序列的最大值。我们将待排序序列构造成一个堆,选出堆顶记录(最大值),然后把剩下的记录重新调整成堆,再选择出堆顶记录(次大值),依次下去,直到堆中只剩下一个记录。

    void shiftHeap(int arr[],int k,int m){
        int i = k;
        int j = i * 2;
        while(j <= m){
            if(j<m && arr[j]<arr[j+1]) j++;
            if(arr[i]>arr[j]) 
              break;
            else{
                arr[0] = arr[i];
                arr[i] = arr[j];
                i = j;
                j = 2 * i;
            }
        }
    }
    
    void heapSort(int arr[],int n){
        int index;
        for(index = n/2;index>=1;index--)
          shiftHeap(arr,index,n);
        for(index=1;index<n;index++){
            arr[0] = arr[1];
            arr[1] = arr[n-index+1];
            arr[n-index+1] = arr[0];
            shiftHeap(arr,1,n-index);
        }
    }

    3、总结

    简单选择排序:时间复杂度为o(n2),是不稳定排序。

    堆排序:时间复杂度为o(nlog2n),是不稳定排序。

    堆排序其实就是每次选择待排序序列中的最大值(或最小),它与简单选择排序的区别就是:简单选择排序是通过比较n-i+1个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。

  • 相关阅读:
    React开发流程及认识
    Python整合AnaConda
    计算机显示器扩展方向调整
    python3 urlencode 和 urldecode 使用
    解决开启Vue项目缺少node_models包问题
    解决开启Vue项目缺少node_models包问题
    python中列表相加
    python炒鸡面试题
    Django中的CBV控制前后端分离模式
    selenuim使用总结
  • 原文地址:https://www.cnblogs.com/whc-uestc/p/4458405.html
Copyright © 2020-2023  润新知