quicksort程序提供部分排序的输出

时间:2015-09-21 09:46:26

标签: c debugging

下面简单的快速排序代码,最后一个元素作为pivot,几乎可以工作,但除了最后一个元素无法排序。有什么想法这个程序出错?

这是输出:

$a.out
 4 3 5 2 1 3 2 3 //input
 1 2 2 3 3 3 5 4 //output

简单交换看起来很好

void swap ( int* a, int* b )
{
    int t = *a;
    *a = *b;
    *b = t;
}

嗯..也可以.. end的问题?

int partition(int a[],int start,int end){
int pivot = a[end];
int pindex=start;int i;

    for ( i=start; i <= end-1; i++){
       if (a[i] <= pivot){
           swap(&a[i],&a[pindex]);pindex++;
       }
    }
    swap(&a[pindex],&a[pivot]);
    return (pindex + 1);
}

当然看起来不错。

void quicksort(int a[],int start,int end){
int pindex;

    if (start < end){
        pindex = partition(a,start,end-1);
        quicksort(a,start,pindex-1);
        quicksort(a,pindex+1,end);
    }
}

简单的主要电话

int main(){
    int a[8] = {4, 3, 5, 2, 1, 3, 2, 3};
    int i=0;

    for(i=0;i<8;i++)
        printf(" %d", a[i]);
    quicksort(a,0,8);
    printf("\n");
    for(i=0;i<8;i++)
        printf(" %d", a[i]);
}

3 个答案:

答案 0 :(得分:2)

好的一些变化

由于doptimusprime指向返回pindex

int partition(int a[],int start,int end){
    int pivot = a[end];
    int pindex=start;int i;
    for ( i=start; i <= end-1; i++){
        if (a[i] <= pivot){
            swap(&a[i],&a[pindex]);pindex++;
        }
    }
    swap(&a[pindex],&a[end]);
    return (pindex);
}

相应地调整快速排序功能

void quicksort(int a[],int start,int end){
    int pindex;

    if (start < end){
        pindex = partition(a,start,end-1);
        quicksort(a,start,pindex); // no pindex-1
        quicksort(a,pindex+1,end);
    }
}

答案 1 :(得分:0)

请查看partition功能。

它应该返回

 return pindex;

而不是pindex+1

因为,请采取以下案例:

1 2 3 4 5

选择5作为支点时,它应返回4,而不是5作为支点索引。

检查pindex必须位于开始和结束(包括两者)之间的不变量。如果枢轴位于末端,则它不能越过末端。

通常,分区从两端开始。你是从一端开始的。尽量做到最后提高效率。否则,在1 2 3 4 5中,您将继续使用相同的元素交换(1与1,2与2等等)。

在分区中:

swap(&a[pindex],&a[pivot]);

应该是

 swap(&a[pindex],&a[end]);

pivot是一个值,而不是索引。

另一项更改,您需要quicksort

  if (start < end){
  pindex = partition(a,start,end-1);
  //As here index is one past last, so make it start..pindex
  quicksort(a,start,pindex);
  quicksort(a,pindex+1,end);
  }

你的分区功能应该是

int partition(int a[],int start,int end){

int pivot = a[end];
int pindex=start;int i;

for ( i=start; i <= end-1; i++){
    if (a[i] <= pivot){
        swap(&a[i],&a[pindex]);pindex++;
        }
    }

    swap(&a[pindex],&a[end]);
    return (pindex);
}

https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme。此处使用此分区方案。

答案 2 :(得分:0)

如果有人输入负数,您的程序将失败。 你为什么要这样复杂化?

这是一个简单的排序:

#include <stdio.h>

void bubble_sort(int *array, int length){
  int i,j, k, temp;

  for (i = 0 ; i < length-1; i++){
    for (k = 0 ; k < length-i-1; k++){
      if (array[k] > array[k+1]){
        temp = array[k];
        array[k]   = array[k+1];
        array[k+1] = temp;
      }
    }
  }

    printf("The sorted Array List:\n\n");

  for ( j = 0 ; j < length ; j++ ){
    printf("%d  ", array[j]);
  }
}

int main(void){
    int array[8] = {4, 3, 5, 2, 1, -1, 2, 3};
    int length = sizeof array / sizeof array[0];

    bubble_sort(array, length);
    printf("\n");

    return 0;
}

输出:

  

-1 1 2 2 3 3 4 5