zoukankan      html  css  js  c++  java
  • 编程算法

    数组中出现次数超过一半的数字 代码(C)


    本文地址: http://blog.csdn.net/caroline_wendy


    题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字.


    1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求.

    2. 使用计数方法依次比較.


    代码: 

    方法1:

    /*
     * main.cpp
     *
     *  Created on: 2014.6.12
     *      Author: Spike
     */
    
    /*eclipse cdt, gcc 4.8.1*/
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int RandomInRange(int min, int max)
    {
        int random = rand() % (max - min + 1) + min;
        return random;
    }
    
    void Swap(int* num1, int* num2)
    {
        int temp = *num1;
        *num1 = *num2;
        *num2 = temp;
    }
    
    int Partition(int data[], int length, int start, int end)
    {
        if(data == NULL || length <= 0 || start < 0 || end >= length) {
        	return -1;
        }
    
        int index = RandomInRange(start, end);
        Swap(&data[index], &data[end]);
    
        int small = start - 1;
        for(index = start; index < end; ++ index)
        {
            if(data[index] < data[end])
            {
                ++ small;
                if(small != index)
                    Swap(&data[index], &data[small]);
            }
        }
    
        ++ small;
        Swap(&data[small], &data[end]);
    
        return small;
    }
    
    bool CheckMoreThanHalf (int* numbers, int length, int number)
    {
    	int times = 0;
    	for (int i=0; i<length; ++i) {
    		if (numbers[i] == number)
    			++times;
    	}
    	if (times*2 <= length) {
    		return false;
    	}
    
    	return true;
    }
    
    int MoreThanHalfNum(int* numbers, int length) {
    	if (numbers == NULL || length <= 0)
    		return 0;
    
    	int middle = length >> 1;
    	int start = 0;
    	int end = length-1;
    	int index = Partition(numbers, length, start, end);
    	while (index != middle) {
    		if (index > middle) { //前面部分的数字多
    			end = index-1;
    			index = Partition(numbers, length, start, end);
    		} else {
    			start = index+1;
    			index = Partition(numbers, length, index+1, start);
    		}
    	}
    
    	int result = numbers[middle];
    	if (!CheckMoreThanHalf(numbers, length, result))
    		return 0;
    
    	return result;
    }
    
    int main(void)
    {
        int str[] =  {1, 2, 3, 4, 4, 4, 5, 4, 4};
        int result = MoreThanHalfNum(str, 9);
        printf("reuslt = %d
    ", result);
    
        return 0;
    }
    


    方法2:

    /*
     * main.cpp
     *
     *  Created on: 2014.6.12
     *      Author: Spike
     */
    
    /*eclipse cdt, gcc 4.8.1*/
    
    #include <stdio.h>
    #include <stdlib.h>
    
    bool CheckMoreThanHalf (int* numbers, int length, int number) {
    	int times = 0;
    	for (int i=0; i<length; ++i) {
    		if (numbers[i] == number)
    			times++;
    	}
    	if (times*2 < length)
    		return false;
    	return true;
    }
    
    int MoreThanHalfNum (int* numbers, int length) {
    	if (numbers == NULL || length <= 0)
    		return 0;
    	int result = numbers[0];
    	int times = 1;
    	for (int i=0; i<length; ++i) {
    		if (times == 0) {
    			result = numbers[i];
    			times = 1;
    		}
    		if (numbers[i] == result) times++;
    		else times--;
    	}
    	if (!CheckMoreThanHalf(numbers, length, result))
    		return 0;
    	return result;
    }
    
    int main(void)
    {
        int str[] =  {1, 2, 3, 2, 2, 2, 5, 2, 4};
        int result = MoreThanHalfNum(str, 9);
        printf("reuslt = %d
    ", result);
    
        return 0;
    }
    



    输出:

    reuslt = 4
    






  • 相关阅读:
    Linux rcp命令详解
    Linux patch命令详解
    Linux paste命令详解
    linux od命令详解
    linux mv命令详解
    Linux more命令详解
    Linux mktemp命令
    MySQL状态变量详解
    mysql性能分析show profile/show profiles
    MySQL执行计划
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6941944.html
Copyright © 2011-2022 走看看