天天看點

假定有20個 有序 數組,每個數組有500個數字,數字類型32位uint數值,現在需要取出這10000個數字中最大的500個,怎麼做?

//3、假定有20個  有序   數組,每個數組有500個數字,數字類型32位uint數值,現在需要取出這10000個數字中最大的500個,怎麼做?

#include<iostream>

using namespace std;

struct node

{

int data;

int next;

};

node obj[20];

void sift(int k,int m,int b[])//調整一個元素在堆的位置

     int i=k,j=2*i+1,temp;

     while(j<m)

     {

       if(j<m-2&&b[j]<b[j+1])// 體會j<m

           j++;

        if(b[i]>=b[j]) break;

       else {

        temp=b[i];

        b[i]=b[j];

        b[j]=temp;

        i=j;

        j=2*j+1;

       }

     }

}

void s_hsort(int n,int a[][500])

    int temp=0,j=0;

    int b[20];

    for(int k=0;k<20;k++)

    {

        b[k]=a[k][0];

        obj[k].data=a[k][0];

        obj[k].next=1;

    }

  for(k=0;k<500;k++)

    for(int i=(n-1)/2;i>=0;i--)//把20個元素調整為大堆的形式

       sift(i,n,b);

       cout<<b[0]<<endl;//輸出堆頂

     for(i=0;i<20;i++)//把堆頂值換成下一個入堆的元素

          if(b[0]==obj[i].data)

                 temp=i;

      b[0]=a[temp][obj[temp].next];

      obj[temp].data=b[0];

      obj[temp].next+=1;

}    

int main()

    int a[20][500];

for(int j=0;j<20;j++)

  for(int i=0;i<500;i++)

     a[j][i]=10000-(i+1)-50*j;

s_hsort(20,a);

return 0;