算法1 C语言代码:
int* CreateArr_1(int N)//算法1
{
int i, j, temp, count;
int* pA = (int*)malloc(sizeof(int) * N);
pA[0]= RandInt(0, N - 1);
for (i = 1; i < N; i++)
{
count = 0; //用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
while (0 == count)//有和temp相同的元素就重新计算
{
temp = RandInt(0, N-1);
for (j = 0; j < i; j++)
{
if (temp == pA[j])//检查出数组中有相同的元素,count=0
{
count = 0;
break;
}
else
count = 1;
}
}
pA[i] = temp;
}
return pA;
}
算法分析:
事件
A
=
{
A
[
i
]
与
A
[
0
]
,
A
[
1
]
,
.
.
.
,
A
[
i
−
1
]
均
不
相
同
}
A=\{A[i]与A[0],A[1],...,A[i-1]均不相同\}
A={A[i]与A[0],A[1],...,A[i−1]均不相同}的概率
P
(
A
)
P(A)
P(A)为:
P
(
A
)
=
N
−
i
N
P(A)=\frac{N-i}{N}
P(A)=NN−i
试验 k k k次,前 k − 1 k-1 k−1次事件A不发生,第 k k k次事件才发生的概率为: p ( 1 − p ) ( k − 1 ) p(1-p)^{(k-1)} p(1−p)(k−1)
计算事件
A
A
A 的数学期望
E
(
A
)
:
E(A):
E(A):
E
(
A
)
=
∑
k
=
0
∞
k
p
(
1
−
p
)
(
k
−
1
)
=
p
+
2
p
(
1
−
p
)
+
⋯
+
(
n
+
1
)
p
(
1
−
p
)
n
+
…
E(A)=\sum_{k=0}^{\infty}kp(1-p)^{(k-1)}=p+2p(1-p)+\dots+(n+1)p(1-p)^{n}+\dots
E(A)=k=0∑∞kp(1−p)(k−1)=p+2p(1−p)+⋯+(n+1)p(1−p)n+…
( 1 − p ) E ( A ) = p ( 1 − p ) + ⋯ + n p ( 1 − p ) n + … (1-p)E(A)= p(1-p)+\dots+np(1-p)^{n}+\dots (1−p)E(A)=p(1−p)+⋯+np(1−p)n+…
错位相减后,可得:
p
E
(
A
)
=
p
+
(
1
−
p
)
+
⋯
+
p
(
1
−
p
)
n
+
⋯
=
p
∑
k
=
0
∞
(
1
−
p
)
k
pE(A)=p+(1-p)+\dots+p(1-p)^{n}+\dots=p\sum_{k=0}^{\infty}(1-p)^{k}
pE(A)=p+(1−p)+⋯+p(1−p)n+⋯=pk=0∑∞(1−p)k
E
(
A
)
=
∑
k
=
0
∞
(
1
−
p
)
k
=
1
1
−
(
1
−
p
)
=
1
p
E(A)=\sum_{k=0}^{\infty}(1-p)^{k}=\frac{1}{1-(1-p)}=\frac{1}{p}
E(A)=k=0∑∞(1−p)k=1−(1−p)1=p1
即平均执行
1
p
\frac{1}{p}
p1次事件才会发生。
在算法1当中,第一层
f
o
r
for
for循环执行
N
−
1
N-1
N−1次,第二层
w
h
i
l
e
while
while循环执行
1
p
\frac{1}{p}
p1次,第三层执行
i
i
i次,总运行时间为:
∑
i
=
1
N
−
1
N
N
−
i
⋅
i
=
N
∑
i
=
1
N
−
1
i
N
−
i
=
N
∑
j
=
1
N
−
1
N
−
j
j
<
N
2
∑
j
=
1
N
−
1
1
j
=
N
2
O
(
l
o
g
N
)
=
O
(
N
2
l
o
g
N
)
\sum_{i=1}^{N-1}\frac{N}{N-i}\cdot i=N\sum_{i=1}^{N-1}\frac{i}{N-i}= N\sum_{j=1}^{N-1}\frac{N-j}{j}<N^{2}\sum_{j=1}^{N-1}\frac{1}{j}=N^{2}O(logN)=O(N^{2}logN)
i=1∑N−1N−iN⋅i=Ni=1∑N−1N−ii=Nj=1∑N−1jN−j<N2j=1∑N−1j1=N2O(logN)=O(N2logN)
算法2 C语言代码:
int* CreateArr_2(int N)
{
//初始化
int* pA = (int*)malloc(sizeof(int) * N);
int* Used = (int*)malloc(sizeof(int) * N);
pA[0] = RandInt(0, N - 1);
Used[pA[0]] = 1;
int i, temp;
int count;
for (i = 1; i < N; i++)
{
count = 0;//用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
while (count == 0)//有和temp相同的元素就重新计算
{
temp = RandInt(0, N - 1);
if (1 == Used[temp]) //看看Used数组中该数字是否被使用
{
count = 0;
}
else
{
count = 1;
Used[temp] = 1;
}
}
pA[i] = temp;
}
return pA;
}
算法分析:
和算法1类似,时间复杂度为: O ( N l o g N ) O(NlogN) O(NlogN)
算法3 C语言代码:
int* CreateArr_3(int N)
{
int* pA = (int*)malloc(sizeof(int) * N);
int i;
for (i = 0; i < N; i++)
{
pA[i] = i + 1;
}
for (i = 0; i < N; i++)
{
Swap(&pA[i], &pA[RandInt(0, i)]);
}
return pA;
}
算法分析:
时间复杂度为: O ( N ) O(N) O(N)
C语言综合代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
int RandInt(int i, int j); //生成 i+1 到 j+1 之间的一个随机数
int* CreateArr_1(int N); //输入数组的长度,数组为0~(N-1)的一个置换
int* CreateArr_2(int N);
int* CreateArr_3(int N);
void Swap(int* a, int* b);//交换a b两个元素的数值
int main(void)
{
srand(time(NULL));
int N = 8;
//采用算法1生成数组
int* pArr_1 = CreateArr_1(N);
int i ;
for (i = 0; i < N; i++)
printf("%d ", pArr_1[i]);
printf("\n");
//采用算法2生成数组
int* pArr_2 = CreateArr_2(N);
for (i = 0; i < N; i++)
printf("%d ", pArr_2[i]);
printf("\n");
//采用算法3生成数组
int* pArr_3 = CreateArr_3(N);
for (i = 0; i < N; i++)
printf("%d ", pArr_3[i]);
return 0;
}
int RandInt(int i, int j)
{
if (i > j)
{
printf("随机数范围输入错误!\n");
exit(-1);
}
if (i == j)
return i;
return rand() % (j - i + 1) + (i+1) ; //求余后的值在0~(j-i)之间
}
int* CreateArr_1(int N)//算法1
{
int i, j, temp, count;
int* pA = (int*)malloc(sizeof(int) * N);
pA[0] = RandInt(0, N-1);
for (i = 1; i < N; i++)
{
count = 0; //用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
while (0 == count)//有和temp相同的元素就重新计算
{
temp = RandInt(0, N-1);
for (j = 0; j < i; j++)
{
if (temp == pA[j])//检查出数组中有相同的元素,count=0
{
count = 0;
break;
}
else
count = 1;
}
}
pA[i] = temp;
}
return pA;
}
int* CreateArr_2(int N)
{
//初始化
int* pA = (int*)malloc(sizeof(int) * N);
int* Used = (int*)malloc(sizeof(int) * N);
pA[0] = RandInt(0, N - 1);
Used[pA[0]] = 1;
int i, temp;
int count;
for (i = 1; i < N; i++)
{
count = 0;//用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
while (count == 0)//有和temp相同的元素就重新计算
{
temp = RandInt(0, N - 1);
if (1 == Used[temp]) //看看Used数组中该数字是否被使用
{
count = 0;
}
else
{
count = 1;
Used[temp] = 1;
}
}
pA[i] = temp;
}
return pA;
}
int* CreateArr_3(int N)
{
int* pA = (int*)malloc(sizeof(int) * N);
int i;
for (i = 0; i < N; i++)
{
pA[i] = i + 1;
}
for (i = 0; i < N; i++)
{
Swap(&pA[i], &pA[RandInt(0, i)]);
}
return pA;
}
void Swap(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}