数组中有一个数字出现了超过数组长度的一般,请找出这个数字。
思路:如果这个数子长度超过一半,那肯定排序后他会出现在middle的位置上!
int Partition(int* num, unsigned int length, int start, int end){
int pivot = num[end];
int i = start-1;
int index;
for (index = start; index<end; index++){
if (num[index] < pivot){
i++;
swap(num[index],num[i]);
}
}
swap (num[index],num[i++]);
return i;
}
int moreHalf(int* num, unsigned int length){
if (num == NULL || length == 0){
return 0;
isValid = false;
}
if (length == 1)
return *num;
int middle = length >> 1;
int start = 0;
int end = length-1;
int index = Partition(num, length, start, end);
while (index != middle){
if (index>middle){
end = index-1;
index = Partition(num, length, start, end);
}
else{
start = index+1;
index = Partition(num, length, start, end);
}
}
return num[middle];
}
bool checkMoreHalf (int* num, int middle, int length){
int pivot = num[middle];
int len = 1;
for (int index = middle-1; index >= 0; index--){
if (num[index] == piovt)
len++;
else
break;
}
for (int index = middle+1; index<length; index++){
if (num[index] == piovt)
len++;
else
break;
}
if (len * 2 <= length)
return false;
return true;
}
2. 计算复杂度O(n)
3. 快速排序的思想很好,常用来求:得到数组中任意第K大的数字