堆排序

来源:互联网 发布:现货看盘软件下载 编辑:程序博客网 时间:2024/04/30 22:41

  1. #include <stdio.h>

  2. #define MAX 10
  3. typedef char ElementType;
  4. typedef ElementType ARR[MAX];
  5. //ARR arr1;//ElementType arr1[MAX];
  6. int len = sizeof(ARR)/sizeof(ElementType);


  7. void swap(ElementType arr[],int i,int j)
  8. {
  9.     ElementType temp = arr[i];
  10.     arr[i] = arr[j];
  11.     arr[j] = temp;
  12. }
  13. void print(ARR arr)
  14. {
  15.     int i;
  16.     for(i = 0;i < len;i++)
  17.     {
  18.          printf("%3d",arr[i]);
  19.     }
  20.     printf("\n");
  21. }
  22. void heapadjust(ARR arr,int n,int m)//传来的N为双亲的下标,
  23. {
  24.     int i;
  25.     ElementType temp = arr[n];
  26.     for(i=2*n+1;i <= m;i = 2*i+1)//i=2*N+1为n的左孩子;m是要循环到最后一个孩子;i=i*2+1表示左孩子的左孩子,
  27. //                                                                           即每次步长加到其左孩子
  28.     {
  29.     if(i < m && arr[i] < arr[i+1])//如果左孩子小于右孩子,
  30.     i++;//                      i=i+1;现在表示左右孩子中大的那个的下标
  31.     if(arr[i] < temp)//如果孩子小于双清跳出循环;
  32.     break;
  33.     arr[n] = arr[i];//不然将大的孩子的值给双亲
  34.     n = i;//持续循环,即将大孩子的下标赋给N作为下次循环的双亲;
  35.     }
  36.     arr[n] = temp;//当俩孩子小于temp时,将temp赋给此时的双亲,
  37. }    //        因为是从下面开始调整的所以当调到上面往下时,下面已经是有序的了


  38. void heap(ARR arr)
  39. {
  40.     int i;
  41.     for(i = (len-2)/2;i>=0;i--)//将满二叉树的最后一个满枝的双亲和最后一个孩子传去调整堆
  42.     {
  43.         heapadjust(arr,i,len-1);//重复调用 将每个二叉树进行调整
  44.     }
  45.     for(i = len-1;i >= 0;i--)
  46.     {
  1.          swap(arr,0,i);//交换二叉树顶和尾部的值,然后重新调整时最大的数都排在顶部,
  2.          heapadjust(arr,0,i-1);//完成从小到大的排序
  3.          print(arr);
  4.      }
  5. }
  6. int main()
  7. {
  8.     ARR arr1 = {10,9,8,7,6,5,4,3,2,1};
  9.     printf("heap : \n");
  10.     heap(arr1);
  11.     return 0;
  12. }


原创粉丝点击