我想要做的是快速排序这12个整数数据{2,3,11,9,12,2,6,15,18,10,7,14}
。
我应该选择位于index-11中的pivot 14
。
环境实践是 GCC 。
#include <stdio.h>
#include <stdlib.h>
#define DATA_SIZE 12
void quick_sort(int *list, int left, int right);
int partition(int *list, int left, int right);
void SWAP(int *x, int *y, int *t) { *t = *x; *x = *y; *y = *t; }
/*main start*/
int main() {
//Initialize data[] for sorting
int data[DATA_SIZE] = {2,3,11,9,12,2,6,15,18,10,7,14};
quick_sort(data, 0, DATA_SIZE-1);
for(int i = 0; i < DATA_SIZE; i++) { printf("%d\t",data[i]);}
return 0;
}
/*Main fuction for recursion.*/
void quick_sort(int *list, int left, int right) {
if(left < right) {
//Pivot selection
int q = partition(list, left, right);
//Divide
quick_sort(list, left, q-1);
quick_sort(list, q+1, right);
}
}
/*Devide and Conquere*/
int partition(int *list, int left, int right) {
int pivot; //pivot
int temp; //temporary variable
int low;
int high;
// select
low = left;
high = right+1;
pivot = list[11];
do {
//proceed
do low++; while(list[low]<pivot);
do high--; while(list[high]>pivot);
//pivot-comparison
if(low < high) SWAP(&list[low],&list[high], &temp);
}while(low < high);
//swap after comparison
SWAP(&list[left], &list[high], &temp);
return high;
}
结果如下。
3 6 2 7 10 9 11 12 14 2 15 18
结果很尴尬,所以我在printf("pivot : %d\n", pivot);
中添加了partition()
。
pivot : 14
pivot : 7
pivot : 6
pivot : 3
pivot : 11
pivot : 9
pivot : 15
因此,我将high = right+1;
中的代码partition()
修改为high = right
。
pivot : 14
pivot : 14
pivot : 14
pivot : 14
pivot : 14
pivot : 14
pivot : 14
pivot : 14
pivot : 14
但排序结果是
11 3 12 9 6 2 10 7 18 15 2 14
答案 0 :(得分:2)
您的方法是错误的:您没有定义数据透视,但您定义了一个选择数据透视的算法。算法的例子是
最后一个实际上是最重要的一个。但是,出于培训目的,请使用第一个。关键是使用确定性行为可以更容易地进行调试。这个随机的支点可以在以后的精神中出现,以及#34; Devide and Conquer&#34;。
答案 1 :(得分:2)
pivot = list[11];
我应该选择位于index-11中的pivot 14。
不,它不是index 11
。它是每个子列表中最右边的元素,而不是一些硬编码索引。通过选择无效的pivot元素,分区将停止工作。