现在的位置: 首页 > 综合 > 正文

(三)堆排序

2013年01月06日 ⁄ 综合 ⁄ 共 1460字 ⁄ 字号 评论关闭
/*******************************************
堆排序,时间复杂度O(nlgn)
伪代码:
1.下标计算[为与程序对应,下标从0开始]
Parent(i):
    return i/2
Left(i):
    return 2*i+1
Right(i):
    return 2*i+2
2.使下标i元素为根的的子树成为最大堆
MAX_HEAPIFY(A,i):
l<——Left(i)
r<——Right(i)
if l<length(A) and A[l]>A[i]
    then largest<——l
    else largest<——i
if r<length(A) and A[r]>A[largest]
    then largest<——r
if largest != i
    then exchange A[i] <——> A[largest]
    MAX_HEAPIFY(A,largest)
3.最大堆的建立,将数组A编译成一个最大堆
BUILD_MAX_HEAP(A):
    heapsize[A]<——length[A]
for i <—— length[A]/2+1  to 0
    MAX_HEAPIFY(A,i)
4.堆排序
HEAP_SORT(A):
    BUILD_MAX_HEAP(A)
    for i<——length[A]-1 to 1
        do exchange A[1] <——>  A[i]
        length[A]<—— length[A]-1
        MAX_HEAPIFY(A,0)
********************************************/
#include <stdio.h>
#include <stdlib.h>
#define PARENT(i) (i)/2
#define LEFT(i) 2*(i)+1
#define RIGHT(i) 2*(i+1)
void max_heapify(int *arr,int index,int len)
{
    int l=LEFT(index);
    int r=RIGHT(index);
    int largest;
    if(l<len && arr[l]>arr[index])
        largest=l;
    else
        largest=index;
    if(r<len && arr[r]>arr[largest])
        largest=r;
    if(largest != index){//将最大元素提升,并递归
        int tmp=arr[largest];
        arr[largest]=arr[index];
        arr[index]=tmp;
        max_heapify(arr,largest,len);
    }
}

void build_maxheap(int *arr,int len)
{
    if(arr==NULL || len<=1)
        return;
    int i;
    for(i=len/2+1;i>=0;--i)
        max_heapify(arr,i,len);
}
void heap_sort(int *arr,int len)
{
    if(arr==NULL || len<=1)
        return;
    int length=len;
    build_maxheap(arr,length);
    int i;
    int tmp;
    for(i=length-1;i>=1;--i){
        tmp=arr[0];
        arr[0]=arr[i];
        arr[i]=tmp;
        max_heapify(arr,0,--length);
    }
}
//test 
int main()
{
    int arr[10]={1,4,6,2,5,8,7,6,9,12};
    heap_sort(arr,10);
    int i;
    for(i=0;i<10;++i)
        printf("%d ",arr[i]);
}

抱歉!评论已关闭.