常用排序算法——堆排序

来源:互联网 发布:js 搜索功能 编辑:程序博客网 时间:2024/06/04 18:52
#include <iostream>using namespace std;template<typename T>void heapify(T *arry,int size,int element, bool dec){    int lchild=element*2+1,rchild=lchild+1;//左右子树    if(dec) {        while(rchild<size)//子树均在范围内        {            //如果比左右子树都小,完成整理            if(arry[element]<=arry[lchild]&&arry[element]<=arry[rchild])            {                return;            }            if(arry[lchild]<=arry[rchild])//如果左边最小            {                //把左面的提到上面                swap(arry[element],arry[lchild]);                //循环时整理子树                element=lchild;            }            else//否则右面最小            {                swap(arry[element],arry[rchild]);//同理                element=rchild;            }            lchild=element*2+1;            rchild=lchild+1;//重新计算子树位置        }        if(lchild<size&&arry[lchild]<arry[element])//只有左子树且子树小于自己        {            swap(arry[lchild],arry[element]);        }    }    else {        while(rchild<size)//子树均在范围内        {            if(arry[element]>arry[lchild]&&arry[element]>arry[rchild])            {                return;            }            if(arry[lchild]>arry[rchild])//如果左边最小            {                swap(arry[element],arry[lchild]);                element=lchild;            }            else            {                swap(arry[element],arry[rchild]);//同理                element=rchild;            }            lchild=element*2+1;            rchild=lchild+1;        }        if(lchild<size&&arry[lchild]>=arry[element])        {            swap(arry[lchild],arry[element]);        }    }    return;}template<typename T>void heap_sort(T *arry,int size, bool dec = true){    int i;    //从子树开始整理树    for(i=size-1;i>=0;i--)    {        heapify(arry,size,i, dec);    }    while(size>0)//拆除树    {        swap(arry[size-1],arry[0]);//将根(最小)与数组最末交换        size--;//树大小减小        heapify(arry,size,0, dec);//整理树    }    return;}int main(){    int size;    cin >> size;    int *arr = new int[size];    for(int i = 0; i < size; ++ i)        cin >> *(arr+i);    heap_sort(arr, size, false);    for(int i = 0; i < size; ++ i)        cout << *(arr + i) << " ";    cout << endl;}
0 0
原创粉丝点击