【算法设计-随机算法】利用随机算法生成均匀随机排序数组

思想:

1.首先生成1到n的数组A

2.生成1到n^3的n个数的随机数组P

例如A=<1,2,3,4> P=<36,3,62,19>

3.对p数组进行从小到大的排序(利用快速排序),生成数组P1=<3,19,36,62>

4.根据3中P1的顺序,生成随机数数组A1=<2,4,1,3>

应用:腾讯面试题目

对于一个斗地主游戏,给出一个发牌的算法,让每个人的牌确保随机。

考虑假设有N张牌,要分出来M张牌,给K个人。我能想到的是,N张牌有N种排列,随机产生一种排列,将产生排列的前M张牌依次分给K个人。使用均匀随机排列算法,能够保证:对于N张牌的N!种排列,且得到的任意一种排列的概率都是相同的,即都为1/(N!)。

代码:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

//快速排序,平均时间复杂度o(nlog2n),最好为o(log2n),最坏为o(n2).是不稳定排序( 交换排序)

int partition(int A[], int left, int right)

{

int pivot = A[left];

while (left < right)

{

if ((left<right) && (A[right] >= pivot))

--right;

A[left] = A[right];

if ((left < right) && A[left] <= pivot)

++left;

A[right] = A[left];

}

A[left] = pivot;

return left;

}

void FastSort(int A[], int left, int right)

{

if (left < right)

{

int pivotloc = partition(A, left, right);

FastSort(A, pivotloc + 1, right);

FastSort(A, left, pivotloc - 1);

}

}

//生成随机数P数组

int* Randomalgorithm(int m,int n)

{

int *P=new int;

srand((unsigned)time(NULL));

for(int i=1;i<=n;i++)

{

P[i]=rand()%(n*n*n-m+1)+m;//生成从m到n^3的随机数

}

return P;

}

int main(void)

{

int n;

printf("要产生从1到n的随机序列,首先请输入n.\n");

scanf("%d",&n);

int *A=new int;

int  *key=new int;

int *P1=new int;

for(int i=1;i<=n;i++)

A[i]=i;

int *P=Randomalgorithm(1,n);

printf("排序前P:");

for(int i=1;i<=n;i++)

printf("%d,",P[i]);

printf("\n");

printf("排序后P1:");

for(int i=1;i<=n;i++)

{

P1[i]=P[i];

}

FastSort(P1,1,n);//对P1数组进行排序

for(int i=1;i<=n;i++)

printf("%d,",P1[i]);

printf("\n");

for(int i=1;i<=n;i++)

{

for(int j=1;j<=n;j++)

{

if(P[i]==P1[j])

key[i]=j;

}

}

for(int i=1;i<=n;i++)

P[i]=A[key[i]];

printf("随机排列数组是:\n");

for(int i=1;i<=n;i++)

printf("%d,",P[i]);

return 0;

}

结果:

时间: 2024-10-11 04:17:31

【算法设计-随机算法】利用随机算法生成均匀随机排序数组的相关文章

算法设计与分析——回溯法算法模板

以深度优先方式系统搜索问题解的算法称为回溯法.在回溯法中,解空间树主要分为了四种子集树.排列树.n叉树和不确定树. 在<算法设计与分析课本>中介绍了11个回溯法的问题样例,这里根据解空间树的类型做一个分类. 子集树 装载问题 符号三角形问题 0-1背包问题 最大团问题 算法模板: void backtrack(int t) { if(搜索到叶子结点) { return; } for(i=0; i<=1; i++) //01二叉树 { if(满足约束函数和限界函数)//剪枝 { backt

算法设计和分析(Prim算法构建最小生成树)

问题: 给定无向图G(N,M)表明图G有N个顶点,M条边,通过Prim算法构造一个最小生成树 分析: 算法流程: 构造好的最小生成树就是step6 运行代码: #include<cstdio> #include<string.h> #include<algorithm> #include<cmath> #include<iostream> #include<vector> #include<queue> #include&

算法设计与分析(屈婉玲)pdf

下载地址:网盘下载 算法设计与分析本教材为计算机科学技术专业核心课程"算法设计与分析"教材.<算法设计与分析>以算法设计技术和分析方法为主线来组织各知识单元,主要内容包括基础知识.分治策略.动态规划.贪心法.回溯与分支限界.算法分析与问题的计算复杂度.NP完全性.近似算法.随机算法.处理难解问题的策略等.书中突出对问题本身的分析和求解方法的阐述,从问题建模.算法设计与分析.改进措施等方面给出适当的建议,同时也简要介绍了计算复杂性理论的核心内容和处理难解问题的一些新技术. &

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

【算法设计-快速排序】随机快速排序算法

1.算法流程: 但是为了减少算法因为初始数据可能已经部分按大小排序,导致算法复杂性会变成o(n2)进行了随机选择方法 在random_partition中随机产生(p,r)之间的一个数字,然后交换A[i]与A[r]这样会使得快速排序算法的复杂性得到降低. 代码实现: #include<stdio.h> #include<stdlib.h> #define DataType int void FastSort(DataType A[], int left, int right);//

【iOS】随机三角瓷砖布局算法

你已经看够iOS鉴于这些默认的正方形块,整齐地显示? 本篇给出一个随机算法设计的三角布局的瓷砖和实施. 这样的规则,并提出妥协随机排列间.它看起来很凌乱,不会有一个新事物. 重点是设计和实施,以实现布局算法,能够改变颜色或者加入图片. 最新源码下载地址:https://github.com/duzixi/Varied-Layouts(持续维护.欢迎互粉) 博文首发地址:http://blog.csdn.net/duzixi 布局生成效果例如以下: watermark/2/text/aHR0cDo

随机森林与集成算法

决策树: 使用决策树算法,我们从树根开始,基于可获得最大信息增益(information gain,IG)的特征来对数据进行划分,我们将在下一节详细介绍信息增益的概念. 通过迭代处理,在每个子节点上重复此划分过程,直到叶子节点.这意味着在每一个节点处,所有的样本都属于同一类别. 在实际应用中,这可能会导致生成一棵深度很大且拥有众多节点的树,这样容易产生过拟合问题,由此,我们一般通过对树进行“剪枝”来限定树的最大深度. 最大化信息增益——获知尽可能准确的结果 为了在可获得最大信息增益的特征处进行节

算法笔记(二)抽牌法产生随机全排列

上一章的算法笔记,并不算一个算法系列的一个合适的开始.而本章将会介绍一种产生随机全排列的方法,下一章开始,就正式开始我们的排序算法了. 在我们的排序算法演示器中,我们需要一组随机的数据来作为排序的开始,而本章,就会产生这么一组随机数据. (一)实现分析 我们需要一组随机的数据,而且似乎产生的方法不会太难.我们只需要通过rand()函数获得一个随机数,让其对count(排序的规模)取模,结果作为数组的索引,其值是当前已产生的随机数的个数,如果已经存在了,继续查找,直到产生随机数的个数与总数相同.

【算法】—— 随机音乐的播放算法

随机播放音乐,这个功能太普通以至于以前从未考虑过其背后实现逻辑. Random还是shuffle 我们经常使用的随机播放功能,在外国同行口中并不是叫Random播放,而是叫Shuffle,洗牌的意思. 为什么不是Random?来看两个例子. 在Spotify成立之初,他们使用一种叫「Fisher-Yates shuffle」的算法去产生一个完全随机(perfectly random )的播放列表,这个算法据说非常简单,只需3行代码搞定,不过它存在致命弱点. 上图中,每种颜色代表一位歌手,也就是说