zoukankan      html  css  js  c++  java
  • 推排序

         这篇博客讨论一下堆排序。

        堆排序就是利用堆这种数据结构来实现排序,堆具有堆序性,最小堆的最小值一定在开头,最大堆的最大值也在开头,因此,我们可以利用堆来排序。

        我们选用最大堆来排序,首先在原来的数组上构建一个最大堆,因此数组的开头就是最大值,我们把这个最大值和堆的最后一个元素交换位置,同时堆的大小减一,再整理堆,如此循环,最后的结果就是排好序的数组。

      代码如下:

    #include<iostream>
    
    using namespace std;
    
    int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};
    
    #define LeftChild(i) (2 * (i) + 1)    //标号从0开始,因此左儿子在2i + 1处
    
    
    //最大堆,最大值在开头
    void PercDown (int A[],int i, int N)
    {
       int Child;
       int Tmp;
       for(Tmp = A[i]; LeftChild(i) < N; i = Child)
       {
          Child = LeftChild(i);
    	  if(Child != N-1 && A[Child + 1] > A[Child])  //寻找较大的儿子
    		  Child++;
    	  if(Tmp < A[Child])
    		  A[i] = A[Child];
    	  else 
    		  break;
    
       }
       A[i] = Tmp;
    }
    void Swap(int &a, int &b)
    {
       int c;
      c = a;
      a = b;
      b = c;
    }
    void Heapsort (int A[], int N)
    {
       int i;
       for(i = N / 2; i >= 0; i--)    //在数组上构建最大堆
    	   PercDown(A,i,N);
       for(i = N - 1; i > 0; i--)
       {
          Swap(A[0],A[i]);   //开始排序,把最大值换到后面去
    	  PercDown(A,0,i);   //整理堆,剩下元素的最大值会回到开头
       }
    }
    
    int main ()
    {
    	Heapsort (A, 13);
    	for(int i = 0; i != 13; ++i)
        {
           cout << A[i] << "  ";
        }
        cout << endl;
        return 0;
    }
    

      堆排序相对来说还是比较快的排序方法。

        夜深了,,,

       

       推荐一首歌 《塘桥夜话》

      

  • 相关阅读:
    TWaver中文社区 » 关于
    RedMon Redirection Port Monitor
    dust good
    HiSpider(Hitask) is a fast and high performance spider with high speed
    42qu.com 找到给你答案的人
    yet another 牛人
    Simple Map Reduce at home
    China (googlegroups) [CPyUG:78205] 基于Python的MapReduce算法的快速构建框架
    retools 0.1 : Python Package Index
    Bloomfilter 的应用场景 黄刚的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6842501.html
Copyright © 2011-2022 走看看