你好,请帮我用C语言编写程序,该程序能随机生成几千万个整数,然后使用多线程技术对它们排序
时间: 2023-11-29 07:06:50 浏览: 93
好的,下面是使用C语言编写的程序,可以随机生成大量的整数,并使用多线程技术对它们进行排序。程序中使用了快速排序算法。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_NUM 10000000 // 生成的最大随机数
#define THREAD_NUM 4 // 线程数量
int nums[MAX_NUM]; // 存储生成的随机数
// 交换两个数
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 快速排序的排序函数
int partition(int nums[], int low, int high) {
int pivot = nums[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (nums[j] < pivot) {
i++;
swap(&nums[i], &nums[j]);
}
}
swap(&nums[i+1], &nums[high]);
return i+1;
}
// 快速排序的递归函数
void quick_sort(int nums[], int low, int high) {
if (low < high) {
int pivot_index = partition(nums, low, high);
quick_sort(nums, low, pivot_index-1);
quick_sort(nums, pivot_index+1, high);
}
}
// 每个线程调用的函数
void* sort_thread(void* arg) {
int thread_id = *(int*)arg;
int start = thread_id * (MAX_NUM / THREAD_NUM);
int end = (thread_id + 1) * (MAX_NUM / THREAD_NUM) - 1;
quick_sort(nums, start, end);
pthread_exit(NULL);
}
int main() {
// 生成随机数
srand(time(NULL));
for (int i = 0; i < MAX_NUM; i++) {
nums[i] = rand() % MAX_NUM;
}
// 创建线程
pthread_t threads[THREAD_NUM];
int thread_ids[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, sort_thread, &thread_ids[i]);
}
// 等待所有线程结束
for (int i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
// 合并结果
int temp[MAX_NUM];
int index[THREAD_NUM];
int total_index = 0;
for (int i = 0; i < THREAD_NUM; i++) {
index[i] = i * (MAX_NUM / THREAD_NUM);
}
while (total_index < MAX_NUM) {
int min_value = MAX_NUM + 1;
int min_index = -1;
for (int i = 0; i < THREAD_NUM; i++) {
if (index[i] < (i+1) * (MAX_NUM / THREAD_NUM) && nums[index[i]] < min_value) {
min_value = nums[index[i]];
min_index = i;
}
}
temp[total_index++] = min_value;
index[min_index]++;
}
// 拷贝结果到原数组
for (int i = 0; i < MAX_NUM; i++) {
nums[i] = temp[i];
}
// 输出结果
printf("排序后的前10个数为:\n");
for (int i = 0; i < 10; i++) {
printf("%d ", nums[i]);
}
printf("\n");
return 0;
}
```
在上面的程序中,我们首先生成了指定数量的随机数,并将它们存储在一个数组中。然后,我们创建了指定数量的线程,每个线程对数组的一部分进行快速排序。最后,我们将排序好的结果合并到一个临时数组中,最后将临时数组的内容拷贝回原数组,并输出排序后的结果。
请注意,多线程排序的效率并不一定比单线程排序高。在实际应用中,需要根据具体情况选择合适的算法和线程数量,以达到最佳的性能。
阅读全文