面试题29:数组中出现次数超过一半的数字

#include<iostream>

using namespace std;

int Partiton(int arr[],int low,int high)
{
    int nSmall = low-1;
    for(;low<high;low++)
    {
        if(arr[low]<arr[high])
        {
            nSmall++;
            if(nSmall != low)
            {
                arr[nSmall] = arr[low] ^ arr[nSmall];
                arr[low] = arr[low] ^ arr[nSmall];
                arr[nSmall] =arr[low] ^ arr[nSmall];
            }
        }
    }
    nSmall++;
    if(nSmall != high)
    {
        arr[high] = arr[nSmall] ^ arr[high];
        arr[nSmall] = arr[nSmall] ^ arr[high];
        arr[high] = arr[nSmall] ^ arr[high];
    }
    return nSmall;
}
void QuickSort(int arr[],int low,int high)
{
    if(low < high)
    {
        int mid = Partiton(arr,low,high);
        QuickSort(arr,low,mid-1);
        QuickSort(arr,mid+1,high);
    }
}
bool CheckMoreThanHalfNum(int arr[],int length,int number)
{
    int num = 0;
    for(int i=0;i<length;i++)
    {
        if(number == arr[i])
        {
            num++;
        }
    }
    if(num*2 > length)
    {
        return true;
    }
    return false;
}
int MoreThanHalfNum(int arr[],int length)
{
    if(arr == NULL || length < 0)
    {
        return -1;
    }
    int middle = length>>1;
    int low = 0;
    int high = length-1;
    int mid = Partiton(arr,low,high);
    while(middle != mid)
    {
        if(middle > mid)
        {
            low = mid + 1;
            mid = Partiton(arr,low,high);
        }
        else
        {
            high = mid - 1;
            mid = Partiton(arr,low,high);
        }
    }
    cout<<endl<<mid<<" "<<middle<<endl;
    int result = -1;
    if(CheckMoreThanHalfNum(arr,length,arr[middle])==true)
    {
        result = arr[middle];
    }
    return result;
}
int main()
{
    int numbers[] = {1, 2, 3, 2, 4, 2, 5, 2, 3};
    cout<<MoreThanHalfNum(numbers,sizeof(numbers)/4)<<endl;
    QuickSort(numbers,0,sizeof(numbers)/4);
    for(int i=0;i<sizeof(numbers)/4;i++)
    {
        cout<<numbers[i]<<" ";
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值