堆排序的另一种思路

来源:互联网 发布:邮箱服务器域名怎么看 编辑:程序博客网 时间:2024/04/28 21:33

//堆排序的另一种思路,并非原地排序,而是再开一个数组记录sortdate的序号,将sortdate的序号进行排序

//对于要了解是原数组的哪一个元素排在首位,或了解某个元素在原数组的位置与排序后的位置

//算法导论的“6.5-8”的最小堆的k路合并可以用此思路,要知道到底是哪一个元素排在首位,再search一遍就不好了

#include<stdio.h>#include<string.h>void exchange(int *p,int *q);void MaxHeapify(int sort[],int i,int heapsize,int rec[]);void BuildHeap(int sort[],int heapsize,int rec[]);void Maxsort(int sort[],int heapsize,int rec[]);int main(){ int f; int rec[10]={0,1,2,3,4,5,6,7,8,9};//此为记录数组rec[0]为最大元素 int sort[10]={4,1,3,2,16,9,10,14,8,7}; int heapsize=10; Maxsort(sort,heapsize,rec); for(f=0;f<10;f++) printf("%d \n",sort[rec[f]]);}void exchange(int *p,int *q){ int t; t=*p; *p=*q; *q=t;}void MaxHeapify(int sort[],int i,int heapsize,int rec[]){ int largest; if(2*i+1<heapsize&&sort[rec[2*i+1]]>sort[rec[i]])  largest=2*i+1; else  largest=i; if(2*i+2<heapsize&&sort[rec[2*i+2]]>sort[rec[largest]])  largest=2*i+2; if(largest!=i) {  exchange(&rec[i],&rec[largest]);//序号的交换,代替元素交换  MaxHeapify(sort,largest,heapsize,rec); }}void BuildHeap(int sort[],int heapsize,int rec[]){ int i; for(i=heapsize/2-1;i>=0;i--)  {   MaxHeapify(sort,i,heapsize,rec);  }}void Maxsort(int sort[],int heapsize,int rec[]){ BuildHeap(sort,heapsize,rec); heapsize=heapsize-1; while(heapsize>=1) {     exchange(&rec[0],&rec[heapsize]);  MaxHeapify(sort,0,heapsize,rec);  heapsize--; }}

原创粉丝点击