堆排序的另一种思路

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

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

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

#include
#include
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+1sort[rec[i]])
  largest=2*i+1;
 else
  largest=i;
 if(2*i+2sort[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--;
 }
}

你可能感兴趣的:(Algorithm,exchange,search,算法)