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
posted @ 2012-11-15 18:49  尔滨之夏  阅读(243)  评论(0编辑  收藏  举报