zoukankan      html  css  js  c++  java
  • 堆排序

    一、选择排序

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

    无论如何:T = O(N2)

    如何快速找到最小元

    二、堆排序

    算法1

    void Heap_Sort(ElementType A[], int N)
    {
        BuildHeap(A);       /* O(N) */
        for(i=0;i<N;i++)
            TmpA[i] = DeleteMin(A); /* O(logN) */
        for(i=0;i<N;i++)    /* O(N) */
            A[i] = TmpA[i];
    }

    T(N)=O(NlogN)

    需要额外O(N)的空间,并且赋值元素需要时间

    算法2

    void Heap_Sort(ElementType A[], int N)
    {
        for(i=N/2-1;i>=0;i--)   /* BuildHeap */
            PercDown(A, i, N);
        for(i=N-1;i>0;i--) {
            Swap(&A[0], &A[i]);     /* DeleteMax */
            PercDown(A, 0, i);
        }
    }

    定理:堆排序处理N个不同元素的随机排列的平均比较次数是2NlogN - O(NloglogN)。

    虽然堆排序给出最佳平均时间复杂度,但实际效果不如用Sedgewick增量序列的希尔排序。

    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    ubuntu android jdk问题
    android adb ubuntu问题
    常用命令
    svn info
    TaskRecord分析
    moveTasktoBack 把当前任务放入后台
    WatchDog机制
    双系统安装
    制作安装U盘
    android 小游戏 ---- 数独(二)
  • 原文地址:https://www.cnblogs.com/ch122633/p/9022329.html
Copyright © 2011-2022 走看看