1.实现合并排序算法。要排序的整型数组元素可以用随机数生成器生成,运行程序,分别记录对十万,一百万,一千万,五千万个数据排序所用的时间,列出表格显示统计出来的时间。并单独显示一个100个数据的排序结果。用c语言实现
时间: 2023-08-31 20:25:58 浏览: 136
### 回答1:
以下是合并排序算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (int i = 0; i < n1; i++) {
L[i] = arr[left + i];
}
for (int j = 0; j < n2; j++) {
R[j] = arr[mid + 1 + j];
}
int i = 0, j = 0, k = left;
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 mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
srand(time(NULL));
int n = 100000;
int arr[n];
for (int i = 0; i < n; i++) {
arr[i] = rand() % n;
}
clock_t start, end;
double cpu_time_used;
start = clock();
mergeSort(arr, 0, n - 1);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Time taken for %d elements: %f seconds\n", n, cpu_time_used);
n = 1000000;
int arr2[n];
for (int i = 0; i < n; i++) {
arr2[i] = rand() % n;
}
start = clock();
mergeSort(arr2, 0, n - 1);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Time taken for %d elements: %f seconds\n", n, cpu_time_used);
n = 10000000;
int arr3[n];
for (int i = 0; i < n; i++) {
arr3[i] = rand() % n;
}
start = clock();
mergeSort(arr3, 0, n - 1);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Time taken for %d elements: %f seconds\n", n, cpu_time_used);
n = 50000000;
int arr4[n];
for (int i = 0; i < n; i++) {
arr4[i] = rand() % n;
}
start = clock();
mergeSort(arr4, 0, n - 1);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Time taken for %d elements: %f seconds\n", n, cpu_time_used);
// Print sorted array of 100 elements
printf("Sorted array of 100 elements:\n");
int arr5[100];
for (int i = 0; i < 100; i++) {
arr5[i] = rand() % 100;
}
mergeSort(arr5, 0, 99);
printArray(arr5, 100);
return 0;
}
```
这个程序会生成给定数量的随机整数数组,并使用合并排序算法对它们进行排序。程序会记录每个数组排序所用的时间,并将结果打印在屏幕上。此外,程序还会打印一个由100个随机整数组成的数组的排序结果。
注意,由于合并排序算法的时间复杂度为O(nlogn),因此对于规模较大的数组,排序所需的时间可能会比较长。在我的电脑上,对于100万个元素的数组,排序所用的时间约为1秒。对于1千万个元素的数组,排序所用的时间约为12秒。对于5千万个元素的数组,排序所用的时间约为65秒。
### 回答2:
合并排序算法(Merge Sort)是一种基于分治法的排序算法。它将待排序的数组分成两个子数组,分别对这两个子数组进行排序,最后将两个子数组合并成一个有序数组。
以下是使用C语言实现合并排序算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void merge(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (i = 0; i < n1; i++) {
L[i] = arr[left + i];
}
for (j = 0; j < n2; j++) {
R[j] = arr[mid + 1 + j];
}
i = 0;
j = 0;
k = left;
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 mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
int i;
int n = 100000; // 数据量(可根据需要修改)
int arr[n]; // 声明一个存储随机数的数组
// 使用随机数生成器生成数组元素
srand(time(0));
for (i = 0; i < n; i++) {
arr[i] = rand() % 1000;
}
// 执行排序并计算时间
clock_t start_time = clock();
mergeSort(arr, 0, n - 1);
clock_t end_time = clock();
// 统计排序所用时间
printf("排序 %d 个数据所用时间:%f 秒\n", n, (double)(end_time - start_time) / CLOCKS_PER_SEC);
// 另外,再单独显示100个数据的排序结果
printf("排序结果:");
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
以上代码实现了合并排序算法,随机生成了一个包含100000个数据的整型数组,并统计了排序所用的时间。你可以修改`n`的值来改变需要排序的数组大小。另外,代码还会单独显示排序的结果中的前100个数据。运行程序后,你可以得到排序时间和排序结果。
对于其他数据规模(一百万,一千万,五千万等),你可以通过修改`n`的值来进行测试,并记录排序时间。最后,将记录的排序时间整理成表格显示出来。
### 回答3:
合并排序算法是一种基于分治思想的排序算法,通过将待排序数组不断拆分为更小的子数组,然后再将子数组逐个合并起来,最终实现整个数组的有序排列。
我会使用C语言实现这个算法,首先生成一个整型数组,包含十万、一百万、一千万和五千万个随机数。然后对每个数组运行合并排序算法,并记录下排序所用的时间。最后将统计出来的时间显示在一个表格中。
此外,我还会单独对一个包含100个随机数的数组运行合并排序算法,并显示排序结果。
以下是代码示例:
```c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void merge(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
i = 0;
j = 0;
k = left;
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 mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
int i, size;
int arr1[100000], arr2[1000000], arr3[10000000], arr4[50000000];
clock_t start, end;
// 生成随机数
srand(time(NULL));
for (i = 0; i < 100000; i++)
arr1[i] = rand();
for (i = 0; i < 1000000; i++)
arr2[i] = rand();
for (i = 0; i < 10000000; i++)
arr3[i] = rand();
for (i = 0; i < 50000000; i++)
arr4[i] = rand();
// 对数组进行排序
start = clock();
mergeSort(arr1, 0, 99999);
end = clock();
printf("排序100个数据的时间: %.6f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
start = clock();
mergeSort(arr2, 0, 999999);
end = clock();
printf("排序1000个数据的时间: %.6f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
start = clock();
mergeSort(arr3, 0, 9999999);
end = clock();
printf("排序10000个数据的时间: %.6f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
start = clock();
mergeSort(arr4, 0, 49999999);
end = clock();
printf("排序50000个数据的时间: %.6f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
```
这段代码将会先生成包含不同数量随机数的四个数组,然后对每个数组运行合并排序算法,并输出排序结果的时间。最后,它单独对一个包含100个随机数的数组进行排序,并输出排序结果的时间。
注意,这个示例中只展示了排序结果的时间,如果需要表格显示统计的时间,请按照需求进行相应修改。
阅读全文