zoukankan      html  css  js  c++  java
  • 九大经典算法之选择排序、堆排序

    05 选择排序 (Selection Sort)

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

    void selection_sort(int arr[], int n) {
        for (int i = 0;i < n - 1;i++) {
            int temp = a[i];
            int t = i;
            for (int j = i + 1;j < n;j++) {
                if (a[j] < temp) {
                    temp = a[j];
                    t = j;
                }    
            }
            a[t] = a[i];
            a[i] = temp;
        }
    }

    空间效率:O(1)

    时间效率:最好情况:O(N)             平均情况:O(N^2)                       最坏情况:O(N^2)

    稳定性(相同元素相对位置变化情况):不稳定

    比较次数与初始状态无关

    06 堆排序(Heap Sort)

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

    void heap_sort(int arr[], int n) {
        int i,temp;
        for (i = (n - 2) / 2; i >= 0; i--)
            percdown(arr, n, i);
        for (i = n - 1;i > 0;i--) {
            temp = arr[i];
            arr[i] = arr[0];
            arr[0] = temp;
            percdown(arr, i, 0);
        }
    }
     
    void percdown(int arr[], int n, int i) {
        int child;
        int x = arr[i];
        for (;i * 2 + 1 <= n - 1;i = child) {
            child = i * 2 + 1;
            if (child < n - 1 && arr[child + 1] > arr[child])
                child++;
            if (x >= arr[child]) break;
            else arr[i] = arr[child];
        }
        arr[i] = x;
    }

    空间效率:O(1)

    时间效率:最好情况:O(Nlog2N)                平均情况:O(Nlog2N)                        最坏情况:O(Nlog2N)   

    稳定性(相同元素相对位置变化情况):不稳定

  • 相关阅读:
    C/C++知识点清单01
    数独GUI程序项目实现
    第三章--Win32程序的执行单元(部分概念及代码讲解)(中-线程同步
    《JAVA程序设计与实例》记录与归纳--继承与多态
    《JAVA程序设计与实例》记录与归纳--类与对象
    C语言范例学习06-上
    单一职责原则
    牙疼真要命,牙坏真烧钱
    跳槽 & 思维导图
    成熟的 Git 分支模型
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10424339.html
Copyright © 2011-2022 走看看