排序算法总结4-堆排序

来源:互联网 发布:mac创建无线网络 编辑:程序博客网 时间:2024/05/14 11:13

堆排序的主要步骤:

1 根据数组,从非叶子结点开始,建立最大(小)堆。

2 交换第一个结点和最后一个结点的数据,此时最后一个结点即为最大(小)值。此时前面n-1个数据重新调整堆。按此循环到结束。


#include<stdio.h>void swap(int *a, int *b){    int temp = *a;    *a = *b;    *b = temp;}void printout(int a[],int n){    int i;    for(i = 0; i < n; i++)    {        printf("%d ",a[i]);    }    printf("\n");}void maxheapdown(int a[],int i,int n)//{    int j,temp;    temp = a[i];    j = 2*i + 1;    while(j < n)    {        if(j + 1 < n && a[j+1] > a[j]) //先在左右孩子中找最大的结点            j++;        if(a[j] > temp)        {            a[i] = a[j];            i = j;            j = 2*i + 1;            //a[i] = temp;        }        if(a[j] <= temp)            break;    }    a[i] = temp;}void buildmaxheap(int a[], int n){    int i;    for(i = n/2 -1; i >= 0; i--)    {        maxheapdown(a,i,n);    }    printf("build:");    printout(a,n);}void maxheapsort(int a[],int n){    int i;    for(i = n-1; i >=0; i--)    {        swap(&a[0],&a[i]);        maxheapdown(a,0,i);    }    printout(a,n);}int main(){    int data2[5] = {2,4,3,5,6};    buildmaxheap(data2,5);//先创建堆    maxheapsort(data2,5);}


复杂度分析

堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。

原创粉丝点击