基于快速排序,寻找众数(出现最多的数),运用分治的思想

// ConsoleApplication4.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

#include<iostream>
using namespace std;

void middl(int &p, int &q, int &r)//找枢轴,然后把枢轴位置都换到第一位,左中右,取中值,放在左边第一个
{
if (p > q) swap(p, q);
if (p > r) swap(p, r);
if (q > r) swap(q, r);
swap(p, q);
}

int quicksort(int *a, int L, int R,int max)//和枢轴相同的数可以和枢轴放一起来缩小下次快排的规模
{

if (L < R)
{
int mid = (L + R) / 2;
middl(a[L], a[mid], a[R]);
int count1 = L, count2 = R;
int i = L;
int j = R;
int key = a[L];

while (i < j)//一趟快排的总控制
{
while (i < j && a[j] > key)j--;//控制j从后往前找第一比key小的
while (i < j)
{
if (a[j] == key)//在右边找到和枢轴相同的数放到数组最右端
{
int term;
term = a[count2];
a[count2] = a[j];
a[j] = term;//在右边找到和枢轴相同的数放到数组最右端
count2--;
j--;
while (i < j && a[j] > key)j--;//找到和key相同的数移动后还要继续找比key小的
}
else
{
a[i++] = a[j];//因为轴值已经记录为key,而a[0]为轴值
break;//加个break是为了一旦找到比key值小的就不再循环
}

}
while (i < j && a[i] < key)i++;//控制i从右往左找第一个比key大的
while (i < j)
{
if (a[i] == key)//在左边找到的和key相同的值放到数组最左端
{
int term;
term = a[count1];
a[count1] = a[i];
a[i] = term;//在左边找到的和key相同的值放到数组最左端
count1++;
i++;
while (i < j && a[i] < key)i++;
}
else
{
a[j--] = a[i];
break;
}

}
}

a[i] = key;//现在a[i]里面值并不是key而是最近比key大或者小的值,
//但是已经赋值给了i或者j最近变动的地方,所以要复制key,也没有事情,
//接下来应该把和枢轴相同的数放在枢轴相邻的位置
int pivot = i;//用一个变量保存当前枢轴位置,因为下边ij都变了,
for (int t1 = L;t1 < count1;t1++)//最左边与key值相同的数,与i左边的值交换
{
int term;
term = a[--i];
a[i] = a[t1];
a[t1] = term;
}
for (int t2 = R;t2 > count2;t2--)//最左边与key值相同的数,与i左边的值交换
{
int term;
term = a[++j];
a[j] = a[t2];
a[t2] = term;
}

cout << endl;
int num = count1 + R - count2+1-L;
max = max > num ? max : num;
if (num < pivot - count1) return quicksort(a, L, pivot - count1 - 1 + L,max);
if (num < count2 - pivot) return quicksort(a, pivot + R - count2 + 1, R,max);
return max;
}
}

int main()
{

int num=15;
int max = 1;
cout << "请输入排序的规模!" << endl;
cin >> num;
int *a = new int[num];//动态数组
cout << "请输入数组!" << endl;
for (int i = 0;i < num;i++)
{
cin >> a[i];
}

cout << "输出原始数组!" << endl;
for (int i = 0;i < num;i++)
{
cout << a[i] << " ";
}
cout << endl;

cout<<quicksort(a, 0, num - 1,max)<<endl;
return 0;
}

原文地址:https://www.cnblogs.com/working-in-heart/p/9840358.html

时间: 2024-08-26 14:45:56

基于快速排序,寻找众数(出现最多的数),运用分治的思想的相关文章

寻找数组中重复次数最多的数

#include<iostream> #include<map> using namespace std; int helper(const int a[],const int n) { map<int,int> m; for(int i = 0;i<n;i++) m[a[i]]++; map<int,int>::iterator comp = m.begin(); for( map<int,int>::iterator it = comp

待字闺中之最多连续数的子集

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 给一个整数数组a[]. 找到当中包括最多连续数的子集,比方给:15, 7, 12, 6, 14, 13, 9, 11,则返回: 5:[11, 12, 13, 14, 15] . 分析:最简单的方法是sort然后scan一遍,可是要 o(nlgn) , 有什么 O(n) 的方法吗?网上有人用map或set来做.但map或set的复杂度还是O(nlgn).并查集能够做到O(n),此题用并查集比較简单. 下面參考h

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

基于快速排序的查找前K个最大数

快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left<right){ let mid=partition(a,left,right);//选出key下标 quickSort(a,left,mid-1);//对key的左半部分排序 quickSort(a,mid+1,right)//对key的右半部份排序 } } function partition(a,left,right){ let key=a[left];//一开始

因数最多的数

样例输入 3 10 100 1000 样例输出 6 60 840 题解: 比如24= 23x 3,它的因数个数有(3 + 1)*(1 +1)=8个. 本题我们只要枚举每个质数的次数即可,用DFS来寻找答案.前15个质数之积已经大于1016,所以我们枚举这15个质数就足够了. 注意第i个质数的次数一定大于第i + 1个质数的次数.因为我们是求最小的那个因数最多的数,如果大质数的次数大于小质数的次数,那交换双方次数,因数个数不会变,但是数会减小. 利用这一点,可以把每次枚举的范围缩小.还有一些剪枝,

数组中出现最多的数,以及接口 Map.Entry&lt;K,V&gt;

1 package test.tools; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 public class TestArr { 9 10 public static void MaxCount(int[] arr) { 11 Map<Integer, Integer> map = new Ha

出现次数最多的数-CCF模拟

问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小的一个. 样例输入 6 10 1 10 20 30 20 样例输出 10 #include <iostream>

CCF 201312-1 出现次数最多的数 (水题)

问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小的一个. 样例输入 6 10 1 10 20 30 20 样例输出 10 析:可以先排序,再挨着算,更新.也可以

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

出现次数最多的数

http://blog.csdn.net/pipisorry/article/details/39434403 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, -, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输出其中最小