24h購物| | PChome| 登入
2009-09-22 16:05:35| 人氣566| 回應0 | 上一篇 | 下一篇

海星

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : 分堆作插入排序+前插+後插

我是分成2500堆

也就是

0~3999 放一堆
4000~7999 放一堆...類推

之後對一個輸入的數字做排序時,找到它是要放第幾堆

找到之後,讓它比較該堆的中位數
若>中位數 , 從後面插入
若<中位數 , 從前面插入
剩餘的部分都是小細節 自己看看程式碼吧!

誰能提供更好的解法!!

/**********************************************************/

#include<stdio.h>
#include<stdlib.h>
int num[2502][4000]={0},top[2502]={0},down[2502]={0};
int input()  
{  
  char cha;  
  int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
  x=cha-48;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
      x=x*10+cha-48;  
    }  
    return x;  
}
main()
{
  int data,a,b,c,time=0;
  char s[10];
  for(a=0;a<2500;a++)
    {top[a]=2000;down[a]=2000;}
  while(scanf("%s",s)==1&&s[0]!='E')
      {
        data=input();
        int divide=data/4000;
        if(s[0]=='G')
           {
             if(data>num[divide][top[divide]+down[divide]/2])
              {
              num[divide][++top[divide]]=data;
              for(a=top[divide];a>down[divide];a--)
                 if(num[divide][a]>num[divide][a-1])
                    {
                       int temp=num[divide][a];
                       num[divide][a]=num[divide][a-1];
                       num[divide][a-1]=temp;
                    }
                 else break;
              }
              else
              {
               num[divide][--down[divide]]=data;
               for(a=down[divide];a<top[divide];a++)
                  if(num[divide][a]<num[divide][a+1])
                     {
                        int temp=num[divide][a];
                        num[divide][a]=num[divide][a+1];
                        num[divide][a+1]=temp;
                     }
                  else break;
              }
           }
        else
           {
              for(a=2501;a>=0;a--)
                 if(data>top[a]-down[a])
                    data-=(top[a]-down[a]);
                 else
                    {
                      printf("%d\n",num[a][down[a]+data-1]);break;
                    }
           }
      }
  return 0;
}

台長: 來源不明

您可能對以下文章有興趣

人氣(566) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:很大的質數判斷
此分類上一篇:生成因數

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文