hrbust 超过半数的数字(快排)

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define MAX 1000010
 4 
 5 int g_a[MAX];
 6 
 7 int pasition(int number[], int len, int left, int right)
 8 {
 9     int i = left;
10     int j = right;
11     number[0] = number[i];
12     while (i < j)
13     {
14         while (i<j && number[j]>number[0])
15             {
16                 j--;
17             }
18         if (i<j)
19             {
20                 number[i++] = number[j];
21             }
22         while (i<j && number[i]<number[0])
23             {
24                 i++;
25             }
26         if (i<j)
27             {
28                 number[j--] = number[i];
29             }
30     }
31     number[i] = number[0];
32     return i;
33 }
34 
35 int get_num(int number[], int len)
36 {
37     int left = 1;
38     int right = len;
39     int mid = len / 2 + 1;
40     int index = pasition(number, len, left, right);
41     while (index != mid)
42     {
43         if (index < mid)
44         {
45             left = index + 1;
46         }
47         else
48         {
49             right = index - 1;
50         }
51         index = pasition(number, len, left, right);
52     }
53     return number[index];
54 }
55 
56 int main()
57 {
58     int t;
59     int n;
60     scanf("%d", &t);
61     while (t--)
62     {
63         scanf("%d", &n);
64         for (int i=1; i<=n; i++)
65         {
66             scanf("%d", &g_a[i]);
67         }
68         printf("%d\n", get_num(g_a,n));
69     }
70     return 0;

 

Description

给定一个n元素的序列,其中存放的都是整数类型的数据。现在保证给出的序列中有一个数,这个数的个数超过整个序列元素总个数的一半,请你找出这个数是多少。

 

Input

输入数据第一行为一个整数T(T<=15)为测试数据的组数。接下来是T组测试数据。

每组测试数据的第一行为一个整数n(1 <= n <= 1000000)。代表序列中元素的个数。

接下来是序列中存放的n个数值。每个数值的范围在[0,2000000]内。

Output

输出数量过半的那个数字。保证每组数据必有唯一的解。

Sample Input
1
10
2 1 2 3 4 5 2 2 2 2
Sample Output
2

转载于:https://www.cnblogs.com/bucuo/archive/2012/11/15/2772066.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值