用c语言生成0~999 999(均包含,或者更大范围)之间的随机整数20 000个,要求随机数都不相同(如相同,则需要去重复并重新生成当前随机数),即,得到20 000个两两不同的随机数,再用归并排序算法进行递增排序。
时间: 2023-12-14 22:02:00 浏览: 11
好的,这是一个比较有技术含量的问题。首先,生成不重复的随机数可以使用Fisher-Yates shuffle算法,具体步骤如下:
1. 初始化一个数组arr,长度为1000000,里面存放0~999999的整数。
2. 从1000000开始倒序遍历arr数组,对于每个位置i,随机生成一个0~i之间的整数j,将arr[i]和arr[j]交换。
3. 经过上述操作后,arr数组中前20000个元素即为所需的不重复的随机数。
4. 使用归并排序算法进行递增排序即可。
下面是C语言的示例代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NUM 1000000
#define N 20000
void Fisher_Yates_shuffle(int arr[], int n)
{
srand(time(NULL));
for (int i = n - 1; i >= 1; --i) {
int j = rand() % (i + 1);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
void merge(int arr[], int l, int m, int r)
{
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (int i = 0; i < n1; ++i)
L[i] = arr[l + i];
for (int j = 0; j < n2; ++j)
R[j] = arr[m + 1 + j];
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
++i;
} else {
arr[k] = R[j];
++j;
}
++k;
}
while (i < n1) {
arr[k] = L[i];
++i;
++k;
}
while (j < n2) {
arr[k] = R[j];
++j;
++k;
}
}
void merge_sort(int arr[], int l, int r)
{
if (l < r) {
int m = l + (r - l) / 2;
merge_sort(arr, l, m);
merge_sort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
int main()
{
int arr[MAX_NUM];
for (int i = 0; i < MAX_NUM; ++i)
arr[i] = i;
Fisher_Yates_shuffle(arr, MAX_NUM);
int unique_arr[N];
int count = 0;
for (int i = 0; i < MAX_NUM && count < N; ++i) {
int j;
for (j = 0; j < count; ++j) {
if (unique_arr[j] == arr[i])
break;
}
if (j == count) {
unique_arr[count] = arr[i];
++count;
}
}
merge_sort(unique_arr, 0, N - 1);
for (int i = 0; i < N; ++i)
printf("%d ", unique_arr[i]);
printf("\n");
return 0;
}
```
注:为了保证代码的可读性和可移植性,上述代码并没有进行过多的优化。实际应用中,可以使用更高效的算法和技巧来提升生成随机数和排序的效率。