王道考研 ++++ 堆排序

#include <stdio.h>
#include <stdlib.h>

void swap(int *a,int *b);
void adjustdown(int *list,int k,int size);
void HeadSort(int *list,int size);
void swap(int *a,int *b)
{
  int temp = *a;
  *a = *b;
  *b = temp;
}
/*調整堆序列*/
void adjustdown(int *list,int k,int size)
{
  int i;
  list[0] = list[k];
  for(i = 2*k;i <= size;i *= 2)
  {
    if(i < size && list[i] < list[i+1])i++;//比較選出兩個子節點中最大的一個
    if(list[0] >= list[i])break;//若子節點都比i小則不繼續
    else
    {
      swap(&list[k],&list[i]);//交換父節點和更大的子節點位置
      k = i;
    }
  }
}
/*堆排*/
void HeadSort(int *list,int size)
{
  int i,j;
  for(i = size/2;i > 0;i--)
    adjustdown(list,i,size);//創建最大根堆
  printf("創建好的最大根堆:");
  for(i = 1;i <= size;i++)
      printf("%d%c",list[i]," \n"[i == size]);
  for(i = size;i > 1;i--)
  {
    swap(&list[1],&list[i]);//交換得size-i+1大的數
    adjustdown(list,1,i-1);//因爲排成堆最大根堆之後swap一次已經取出一個最大值所以i-1
    printf("第%d次調整堆:",size-i+1);
    for(j = 1;j <= size;j++)
        printf("%d%c",list[j]," \n"[j == size]);
  }
}
int main(int argc, char const *argv[]) {
  int size,*list,i;
  printf("請輸入數組大小:");
  scanf("%d",&size);
  list = (int*)malloc(sizeof(int)*(size+1));
  printf("請輸入%d個元素:\n",size);
  for(i = 1;i <= size;i++)
      scanf("%d",&list[i]);
  HeadSort(list,size);
  return 0;
}
//34 76 12 37 89 32 51 74 21 82

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章