1、定义 Perm–全排列函数
代码如下:
void Perm(int* arr,int size,int N)
{
if(size == N)
{
for(size_t i=0;i<size;++i)
cout<<arr[i];
cout<<endl;
}
else
{
for(size_t i=N;i<size;++i)
{
std::swap(arr[i],arr[N]);
Perm(arr,size,N+1);
std::swap(arr[i],arr[N]);
}
}
}
详细解释:
例如传入arr 数组为12345
(1)Perm(arr,5,3):表示arr数组的下标为3的开始全排列,即45全排列。
输出:12345 12354
(2)Perm(arr,5,2):表示arr的后3位全排列。即345全排列。
输出:12345 12354 12435 12453 12543 12534
(3)Perm(arr,5,0):表示arr数组全排列。此处验证省略。可自行验证。
时间复杂度为:N+N*(N-1)+N*(N-1)(N-2)+………..+1
约等于 O(N!)
以下代码可用于带重复元素的全排列:
#include<stdio.h>
#include<malloc.h>
int len;
int count = 0;
void swap(int *a, int *b)
{
int tem;
tem = *a;
*a = *b;
*b = tem;
}
bool clap(int * ar, int be, int en)
{
if(en > be)
{
for(int i = be; i < en; i++)
{
if(ar[i] == ar[en])
return false;
}
}
return true;
}
void fullypai(int * arr, int beg, int end)
{
if (beg == end)
{
for(int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
++count;
}
else
{
for(int i = beg; i < end; i++)
{
if(clap(arr, beg, i))
{
swap(arr+beg, arr+i);
fullypai(arr, beg+1, end);
swap(arr+beg, arr+i);
}
}
}
}
int main()
{
printf("please input a number len and an array include len element:\n");
scanf("%d\n", &len);
int * array = (int *)malloc(sizeof(int) * len);
for(int i = 0; i < len; i++)
{
scanf("%d", &array[i]);
}
printf("\n");
fullypai(array, 0, len);
printf("totle:%d\n",count);
return 0;
}
2、从0到n-1中随机等概率输出m个不重复的数
void knuth(int n,int m)
{
srand((unsigned int)time(0));
for(int i = 0;i<n;i++)
{
if(rand()%(n-i)<m)
{
cout<<i<<endl;
m--;
}
}
}
思路解析
for循环执行了n次,每次输出不同的i值,总共满足条件的i值有m个,因此,m个不重复的数的要求已达到。
下面考虑如何等概率?
i=0时,rand()%(n-i)取值范围为0-n-1,共计n个数,此时如果输出0,只需要rand()%(n-i)小于m,因此,i=0被输出的概率为m/n
i=1时,rand()%(n-i)取值范围为0-n-2,共计n-1个数,此时如果0已经输出了,则m已经自减,此时为m-1,则i=1被输出的概率为(m-1)/(n-1);如果0没有被输出,则m未自减,此时,i=1被输出的概率为m/(n-1)。此时,i=1被输出的概率为(1-m/n)x(m/(n-1))+m/nx(m-1)/(n-1)=m/n。
依次类推,每个数被输出的概率都是m/n。
3、二分法查找元素
#include<iostream>
#include<algorithm>
using namespace std;
int find(int list[], int ele, int length)
{
const int s = 0;
const int e = length;
int start = s;
int end = e;
while(start <= end)
{
int tem = (start+end)/2;
if(list[tem] == ele)
{
cout << "The element is in the list" << endl;
return 1;
}
if(list[tem] > ele)
{
end = tem-1;
}
if(list[tem] < ele)
{
start = tem+1;
}
}
cout << "The element is not in the list" << endl;
return 1;
}
int main()
{
int a[4] = {2, 8, 5, 7};
int len = sizeof(a)/sizeof(a[1]);
int x;
cin >> x;
sort(a, a+4);
find(a, x, len);
return 0;
}