堆排序

来源:互联网 发布:linux下新建文件夹 编辑:程序博客网 时间:2024/05/22 09:00

堆排序是不稳定的排序,其时间复杂度最差、平均、最好均为O(nlogn),空间复杂度为1

对大根堆排序得到的是递增序列(常用)
对小根堆排序得到的是递减序列

♯define LeftChild(i) (2*(i)+1)

void Swap(int *p, int *q);
void PercDown(int A[], int FatherPos, int size);//堆排序功能子函数
void Heapsort(int A[], int size);//堆排序功能函数

int main(void)
{
int A[] = {9,8,7,6,5,4,3,2,1};
int i, size = sizeof(A)/sizeof(int);

Heapsort(A,size);for(i = 0; i < size; i++)    printf("%d ",A[i]);printf("\n");return 0;

}

void Heapsort(int A[], int size)
{
int i;

//建大根堆for(i = size/2; i >= 0; i--)    PercDown(A,i,size);//堆排序for(i = size-1; i > 0; i--){    Swap(&A[0], &A[i]);    PercDown(A,0,i);}

}

void PercDown(int A[], int FatherPos, int size)
{
int Temp;
int Child;

for(Temp = A[FatherPos]; LeftChild(FatherPos) < size; FatherPos = Child){    Child = LeftChild(FatherPos);    if((Child != size-1) && (A[Child+1] > A[Child]))        Child++;    if(Temp < A[Child])        A[FatherPos] = A[Child];    else        break;}A[FatherPos] = Temp;

}

void Swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}

0 0
原创粉丝点击