一、问题描述
给出一个数组, 数组中存在一个数据,其出现次数超过一半的的数组长度,求出这个数据;
可以使用快速排序方法, 然后中位数就是要求的数据,其时间复杂度是O(nlogn);
二、基于partition的算法
1) 在数组中随机寻找一个数据pivot,然后调整数组使得pivot 左边的数据都小于pivot, pivot右边的数据都大于pivot, 返回数据pivot的下标索引index;
如果index == mid,即找到了问题的解;
如果index > mid, 在左边集合中继续寻找index;
如果index < mid, 在右边集合中继续寻找index;
具体的代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int partition(int* arr, int i, int j) {
int tmp = arr[i];
while (i < j) {
while (i < j && arr[j] >= tmp)
j--;
arr[i] = arr[j];
while (i < j && arr[i] <= tmp)
i++;
arr[j] = arr[i];
}
arr