n个数的排序--堆排序

来源:互联网 发布:网络端口怎么拆下来 编辑:程序博客网 时间:2024/06/05 06:12

n个数的排序
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
Problem Description

LeiQ当上了体育委员,现在老师让他去给班级里的人排队,LeiQ刚学了排序,所以他想以这种方式给班级里的人排队(从矮到高),他想知道排序完成后的结果。
Input

多组输入,每组的第一行是一个正数n(1<=n<=100),第二行是n个数,表示每一个人的高度。

Output

输出排序完成后的结果。
Example Input

3
176 175 174
Example Output

174 175 176
Hint

从小到大排序需要生成一个最大堆,然后每次把堆顶的最大元素放到末尾,即完成了排序。

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <algorithm>#define SIZE 10000typedef struct {    int *arr;    int len;}Heap;void heapInit(Heap &H){    H.arr = (int *)malloc(sizeof(int)*SIZE);    H.len = 0;    H.arr[0] = INT_MAX;}void heapAdjust(Heap &H,int start,int end){    int temp = H.arr[start];    for(int i = start*2;i<=end;i=i*2)    {        if(i<end&&H.arr[i+1]>H.arr[i])        {            i++;        }        if(temp>H.arr[i])        {            break;        }        H.arr[start] = H.arr[i];        start = i;     }    H.arr[start] = temp;}void heapInsert(Heap &H,int data){    H.arr[++H.len] = data;    int k = H.len;    while(data>H.arr[k/2])    {        H.arr[k] = H.arr[k/2];        k = k/2;    }    H.arr[k] = data;}void Swap(int *a,int *b){    int temp = *a;    *a = *b;    *b = temp;}void heapSort(Heap &H){    for(int i = H.len;i>0;i--)    {        Swap(&H.arr[1],&H.arr[i]);        heapAdjust(H,1,i-1);    }}int main(){    int n;    while(~scanf("%d",&n))    {        Heap H;        heapInit(H);        for(int i = 0;i<n;i++)        {            int temp ;            scanf("%d",&temp);            //H.arr[++H.len] = temp;            heapInsert(H,temp);        }        heapSort(H);        for(int i = 1;i<=H.len;i++)        {            if(i==1)            {                printf("%d",H.arr[i]);            }            else            {                printf(" %d",H.arr[i]);            }         }          printf("\n");    }    return 0;} 
原创粉丝点击