zoukankan      html  css  js  c++  java
  • 堆排序实现

    #include <iostream>
    #define parent(i)  i/2
    #define left(i)  2*i
    #define right(i)  2*i+1
    
    using namespace std;
    
    /*
      function:  heapsort.
    */
    
    void swap(int *a, int *b)
    {
      int tmp;
      tmp = *a;
      *a = *b;
      *b = tmp;
    }
    
    void max_heapify(int *a, int i,int N) //保持堆的性质(递归版)
    { 
      int l ;
      int r;
      int largest = -1;
      l = left(i);
      r = right(i);
    
      if(l <= N && a[l] > a[i])
    	  largest = l;
      else
    	  largest = i;
      if(r <= N && a[r] > a[largest])
    	  largest = r;
      if(largest != i)
      {
        swap(&a[i],&a[largest]);
    	max_heapify(a,largest,N);
      }
     
    }
    
    void max_heapify2(int *a, int i, int N) //保持堆的性质(迭代版)
    {
      int j;
      while(2*i <= N)
      {
        j = 2*i;
    	if(j <= N &&a[j] < a[j+1])
    		j++;
    	if(!(a[i] < a[j]))
    		break;
    	swap(&a[i],&a[j]);
    	i = j;
    
    
      }
    }
    
    void build_max_heap(int *a, int l, int r)  // 建堆
    {
      int i;
      for(i = r/2; i >= 1  ; i--)
    	  max_heapify2(a,i,r);
    }
    
    void heap_sort(int *a,int l, int r) //堆排
    { 
      int i;
      int len = r - l ;
      build_max_heap(a,l,r);
      
      for(i = len; i >= 2; i--)
      {
    	  swap(&a[1],&a[i]);
    	  printf("maxi is %d and is %d
    ",a[i],i);
    	  len--;
    	  max_heapify(a,l,len);
      }
      
    }
    
    
    int main()
    { 
      int i;
      int a[11] = {0,4,1,3,2,16,9,10,14,8,7};
      
      heap_sort(a,1,11);
    
      printf("after sort:
    ");
      for(i = 1; i < 11; i++)
      {
        printf("%d
    ",a[i]);
      }
      
      return 0;
    }


  • 相关阅读:
    洛谷 P1313 计算系数
    洛谷 P1088 火星人
    洛谷 P1049 装箱问题
    P5016 龙虎斗
    洛谷P1208
    求lca
    没有上司的舞会
    最短路spfa
    懒羊羊找朋友
    简单的图论问题之单源最短路dijkstra算法
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3258039.html
Copyright © 2011-2022 走看看