寻找主元问题(即出现次数大于n/2的元素);
思路:排序,然后对相邻元素计数(双指针 j依赖于i);
快排模板要点:
1. 递归终止条件
2. while中的i < j 以及 if + swap中的i < j都是为了直接跳出循环,无需对i = j的情况多余处理
3. do while结构而非while结构,防止都为x的情况导致i与j不发生变化,然后死循环
4. q[i]<x 与 q[j]>x结构,考虑值全部相同,可能越界
5. l, j与j + 1, r,考虑特殊情况,取到值最小或值最大,前者j=0,后者j=r-1,该模板下的分治处理手段合理;
#include <stdio.h>
int a[100];
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1], temp;
while (i < j) {
do i ++; while (q[i] < x);
do j --; while (q[j] > x);
if (i < j) {
temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
quick_sort(q, l, j); quick_sort(q, j + 1, r);
}
int Find_Pval(int a[], int n) {
int tag = 0, ref;
quick_sort(a, 0, n - 1);
for (int i = 0, j, k; i < n; i ++) {
j = i + 1, k = 1;
while (j < n && a[i] == a[j]) k ++, j ++;
if (k > n / 2) {
tag = 1, ref = a[i];
break;
}
else i = j - 1;
}
return tag == 1 ? ref : -1;
}
int main() {
int n; scanf("%d", &n);
for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
printf("%d", Find_Pval(a, n));
return 0;
}