堆排序

来源:互联网 发布:游戏美工入门 编辑:程序博客网 时间:2024/06/06 03:58
#include<iostream>using namespace std;void duisort(int a[],int parent,int lenth){    int temp = a[parent];       //取父节点的值    int child = parent * 2 + 1;  //取第一个子节点,这里默认取左边值    while (child<lenth)    {        if (a[child] < a[child + 1])   //如果右边的数更大,取右边的数        {            child++;        }        if (a[child] < temp)      //如果父节点最大,直接退出循环        {            break;        }        a[parent] = a[child];  //说明子节点比父节点大,将子节点的值赋给父节点,同时父节点的值保存在temp中不会丢失        parent = child;      //继续遍历下面的节点,找到适合父节点的位置        child = child * 2 + 1;    }    a[parent] = temp;     //最后将找到的适合父节点的位置给父节点,这个时候说明他的后面已经形成了最大堆}int main(){    int n;    cin >> n;    int a[50];    for (int i = 0; i < n; i++)    {        cin >> a[i];    }    for (int i = n / 2 - 1; i >= 0; i--)    //这里的作用是形成最大堆,从最后一个有孩子的子节点开始,向前遍历,这样可以保证生成最大堆    {        duisort(a, i, n);    }    for (int i = 0; i < n; i++)    {        cout << a[i] << " ";    }    cout << endl;    for (int i = n-1; i >0;)     //这个时候a[0]已经是堆中最大的数,所以将其交换,同时再一次的进行堆运算,由于已经生成了最大堆,所以这个时候可以保证能够一次生成最大堆    {        int temp = a[0];        a[0] = a[i];        a[i--] = temp;   //交换两个数的位置        duisort(a, 0, i);    //这里在进行最大堆的运算    }    for (int i = 0; i < n; i++)    {        cout << a[i] << " ";    }    cout << endl;    return 0;}
原创粉丝点击