c++堆排序算法的实现

来源:互联网 发布:程序员鼓励师是真的吗 编辑:程序博客网 时间:2024/05/18 05:20

//堆排序是一种选择排序,是一种不稳定的排序方法,基本思想是:以小根堆为例,首先,将要排序的数组创建为一个小根堆,然后,将小根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置放入有序区,然后将新的无序区调整为小根堆。重复上述操作至结束。具体代码实现如下:

 

#include <iostream>

using namespace ::std;
void MinTop(int number[],int i,int n)
{
        int left,right;
        left = 2 * i + 1;
        right = 2 * i + 2;
        int small = i;
        if ((n > left) && number[left] < number[i])
         {
                     small = left;
         }
        if ((n > right) && number[right] < number[small])
        {
                    small = right;
        }
       if (small != i)
       {
                   int temp = number[i];
                  number[i] = number[small];
                  number[small] = temp;
                  MinTop(number,small,n);
       }
}
void BuildHeap(int number[],int n)
{
        for (int i = n /2 - 1;i >= 0;i--)
        {
               MinTop(number,i,n);
         }
}
void Heapsort(int number[],int n)
{
         BuildHeap(number,n);
         for (int i = n - 1;i > 0;i--)
        {
               int temp = number[0];
               number[0] = number[i];
               number[i] = temp;
               MinTop(number,0,i);
         }
}
int main()
{
        int *number;
        int i = 0,n;
       cout<<"请输入排序数据个数:"<<endl;
       cin>>n;
       number = (int *)malloc(n * sizeof(int));
       cout<<"输入待排序数据:"<<endl;
       while(i < n)
       {
             cin>>number[i++];
        }
       Heapsort(number,n);
       cout<<"升序结果如下:"<<endl;
       for (i = n - 1;i >= 0;i--)
       {
             cout<<number[i];
        }
       cout<<endl;
       free(number);
       return 0;
}

 注:堆排序的时间复杂度为O(n log n),空间复杂度为O(1)。

原创粉丝点击