【算法设计-堆排序】大根堆排序

来源:互联网 发布:调星仪软件下载 编辑:程序博客网 时间:2024/05/23 23:24

1.堆排序不仅拥有与归并排序一样的时间复杂度为o(nlgn),而且空间复杂度所占秩序额外的几个元素空间,这个又有插入排序的优势。

2.堆排序分为3部分,第一部分是保持堆的性质的函数MAX_HEAPIFY函数,用于保持堆的性质:父结点的值要大于子节点。

                                     第二部分是创建大根堆的函数,BUILD_MAX_HEAP这个函数从第一个非叶节点开始进行MAX_HEAPIFY函数。最终创建一个大根堆。

                                    第三部分是堆排序部分,输出一个最大值KEY[1],然后将最后一个值替换第一个值,重复进行。

代码如下:

#include<iostream>
using namespace std;
typedef struct heap
{
 int heap_size;
 int *key;
}heap;
void initialize(heap *A)
{
A->key=new int;
A->heap_size=0;
}
void MAX_HEAPIFY(heap *A,int i)//为了使堆保持大根堆的性质(我这里利用了循环操作的方法,而算法导论中应用了递归调用的办法)
{
//非递归方法
int largest;
      int l=2*i;//l是A的左孩子
 int r=2*i+1;//r是A的右孩子
 if(l<=A->heap_size&&A->key[l]>A->key[i])
 largest=l;
 else 
 largest=i;
 if(r<=A->heap_size&&A->key[r]>A->key[largest])
 largest=r;
  while(largest!=i)
  {
 int temp=A->key[i];
 A->key[i]=A->key[largest];
 A->key[largest]=temp;
  i=largest;
  l=2*i;
  r=2*i+1;
     if(l<=A->heap_size&&A->key[l]>A->key[i])
    largest=l;
     else 
    largest=i;
     if(r<=A->heap_size&&A->key[r]>A->key[largest])
    largest=r;
  }
//这个是递归方法
     /* 
int largest;
int l=2*i;//l是A的左孩子
 int r=2*i+1;//r是A的右孩子
 if(l<=A->heap_size&&A->key[l]>A->key[i])
 largest=l;
 else 
 largest=i;
 if(r<=A->heap_size&&A->key[r]>A->key[largest])
 largest=r;
  if(largest!=i)
  {
 int temp=A->key[i];
 A->key[i]=A->key[largest];
 A->key[largest]=temp;
 MAX_HEAPIFY(A,largest); 
  }*/
}
void BUILD_MAX_HEAP(heap *A)
{
int m=(A->heap_size)/2;
while(m>=1)
{
MAX_HEAPIFY(A,m);
m--;
}
}
void HEAP_SORT(heap *A)
{
BUILD_MAX_HEAP(A);
int length=A->heap_size;
printf("大根堆排序后的数组是:");
printf("%d,",A->key[1]);
for(int i=length;i>=2;i--)
{
A->key[1]=A->key[i];
A->heap_size--;
MAX_HEAPIFY(A,1);//现在只有这个堆的第一个结点是错误的,其他的子树都是大根堆
printf("%d,",A->key[1]);
}
printf("\n");
printf("done\n");
}
int main(void)
{
heap *A=new heap;
initialize(A);
printf("请输入一组堆的值以#结束?\n");
int key;
int i=1;
while(scanf("%d",&key)==1)
{
A->key[i]=key;
i++;
}
A->heap_size=i-1;
HEAP_SORT(A);
}

结果展示:


0 0
原创粉丝点击