堆排序

一、选择排序

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增量序列的希尔排序。

无欲速,无见小利。欲速,则不达;见小利,则大事不成。
原文地址:https://www.cnblogs.com/ch122633/p/9022329.html