c - 快速排序 - 不同的实现不起作用
问题描述
所以我尝试实现一个quicksort
算法,但我没有将i, j
两者都设置为start
,而是设置j
为end - 1
(因为end
我有pivot
)。我也用3-median
来选择pivot
. 基本上,我做与平均算法相同的事情quicksort
,除了反转,我返回pivot
at i
oncei
和j
cross。但它不起作用,为什么?
#include <stdlib.h>
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int median(int arr[], int left, int right) {
int center = (left + right) / 2;
if (arr[left] > arr[center]) {
swap(&arr[left], &arr[center]);
}
if (arr[left] > arr[right]) {
swap(&arr[left], &arr[right]);
}
if (arr[center] > arr[right]) {
swap(&arr[center], &arr[right]);
}
swap(&arr[center], &arr[right]);
return arr[right];
}
int partition(int arr[], int left, int right) {
int pivot = median(arr, left, right);
int i = left; int j = right - 1;
for (;;) {
while (arr[i++] < pivot);
while (arr[j--] > pivot);
if (i < j) {
swap(&arr[i], &arr[j]);
} else {
break;
}
}
swap(&arr[i], &arr[right]);
return i;
}
void quicksort(int arr[], int left, int right) {
if (left < right) {
int piv_pos = partition(arr, left, right);
quicksort(arr, left, piv_pos - 1);
quicksort(arr, piv_pos + 1, right);
}
}
int main() {
int test[] = { 2, 7, 1, 4, 10, 6, 12, 19, 26, 0, 40, 5, 39, 16, 0, 3, 4, 12, 2, 8 };
int size = sizeof(test) / sizeof(test[0]);
quicksort(test, 0, size - 1);
for (int i = 0; i < size; i++) {
printf("%d\n", test[i]);
}
return 0;
}
输出:
16
0
7
12
4
2
19
3
5
39
8
10
6
40
0
1
26
4
12
2
解决方案
推荐阅读
- python - 根据另一个索引值修改 DataFrame 索引中的值
- java - javax.ejb.EJBException:发送请求时出错[原因:java.io.OptionalDataException]
- arrays - MongoDB - 无法将项目推送到数组内的对象内的数组
- php - Laravel - 从刀片视图中的模型关系中检索属性
- python - 从Mysql中选择时无法转换Python类型元组
- elasticsearch - 如何调试弹性搜索错误 number_format_exception 原因为“空字符串”但没有字段名称
- list - “这不是记录”-尝试对列表进行排序时出错
- javascript - 使用 JS 和 VBA 将空白文本框添加到 Abobe Acrobat PDF
- json - 去 openweathermap 预测返回类型
- css - 如何使 2 个 div 具有相同的高度,一个图像(没有 javascript)?