C语言用qsort和多线程排序
时间: 2023-12-04 21:40:30 浏览: 202
qsort C语言版
C语言中使用qsort函数可以对数组进行快速排序,而多线程可以实现并行排序。下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define ARRAY_SIZE 1000000
#define NUM_THREADS 4
int arr[ARRAY_SIZE];
// 比较函数用于qsort
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
// 排序线程函数
void* sortThread(void* arg) {
int thread_id = *(int*)arg;
int start = thread_id * (ARRAY_SIZE / NUM_THREADS);
int end = start + (ARRAY_SIZE / NUM_THREADS);
// 使用qsort对数组片段进行排序
qsort(arr + start, end - start, sizeof(int), compare);
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
// 生成随机数组
for (int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = rand();
}
// 创建多个排序线程
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, sortThread, &thread_ids[i]);
}
// 等待所有线程完成
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
// 合并排序结果
int temp[ARRAY_SIZE];
int indexes[NUM_THREADS] = {0};
for (int i = 0; i < ARRAY_SIZE; i++) {
int min_index = -1;
int min_value = INT_MAX;
// 在每个线程的排序结果中选取最小值
for (int j = 0; j < NUM_THREADS; j++) {
if (indexes[j] < ((j + 1) * (ARRAY_SIZE / NUM_THREADS)) && arr[indexes[j]] < min_value) {
min_index = j;
min_value = arr[indexes[j]];
}
}
temp[i] = arr[indexes[min_index]];
indexes[min_index]++;
}
// 将排序结果赋值给原数组
for (int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = temp[i];
}
// 打印排序后的数组
for (int i = 0; i < ARRAY_SIZE; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
以上代码演示了如何使用qsort函数对数组进行快速排序,并利用多线程实现并行排序。在主函数中,我们首先生成一个随机数组,然后创建多个排序线程,并使用qsort函数对每个线程的数组片段进行排序。之后,我们等待所有线程完成,并将各个线程的排序结果合并到一个临时数组中。最后,我们将排序结果赋值给原数组,并打印出排序后的数组。
阅读全文