堆排序

一、选择排序

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

 

posted @ 2018-05-10 23:17  习惯就好233  阅读(197)  评论(0编辑  收藏  举报