在C中实现Quicksort

时间:2018-04-12 05:45:59

标签: c quicksort

我想要做的是快速排序这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

2 个答案:

答案 0 :(得分:2)

您的方法是错误的:您没有定义数据透视,但您定义了一个选择数据透视的算法。算法的例子是

  • 选择第一个元素。
  • 在中间选择一个元素。
  • 选择一个随机元素。

最后一个实际上是最重要的一个。但是,出于培训目的,请使用第一个。关键是使用确定性行为可以更容易地进行调试。这个随机的支点可以在以后的精神中出现,以及#34; Devide and Conquer&#34;。

答案 1 :(得分:2)

pivot = list[11];
  

我应该选择位于index-11中的pivot 14。

不,它不是index 11。它是每个子列表中最右边的元素,而不是一些硬编码索引。通过选择无效的pivot元素,分区将停止工作。