標籤:mystra 編程演算法 數組超過一半 代碼 c
數組中出現次數超過一半的數字 代碼(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\n", 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\n", result); return 0;}
輸出:
reuslt = 4