【问题标题】:Using a quicksort in c-99在 c-99 中使用快速排序
【发布时间】:2014-10-29 20:45:07
【问题描述】:

我在 c-99 脚本中使用以下快速排序。

问题是它可以编译但没有任何输出。我正在尝试将 5,4,3,2,1 分类为 1,2,3,4,5 我什么也没得到。

我不确定我做错了什么。

这是我的代码

\\pick a pivot
\\make a temporary left and right list
\\filter items to left and to the right
\\put it all back into the array left and pivot
\\recurse right side


#include <time.h>
#include <stdlib.h>

void subquicksort(int array[], int start, int end){

    int leng=end-start;
    if (leng<=1){
        return;
    }

    int pivot=array[start];
    int leftlist[leng];      \\create temporary left and right list
    int lindex=0;
    int rightlist[leng];
    int rindex=0;

    for(int i=start + 1; i < leng; i++){

        if(array[i]<pivot) {
            leftlist[lindex++]=array[i];
        }
        else{
            rightlist[rindex++]=array[i];
        }
    }

    array[start + lindex]=pivot;

    for( int i=start +1; i <leng; i++){

        if (i<lindex){
            array[start + i]=leftlist[i];
        }
        if(i==lindex){
            continue;
        }
        if(i>lindex){
            array[start + i]=rightlist[i-lindex-1];
        }
    }

    subquicksort(array,start,start+lindex);
    subquicksort(array,start+lindex+1,end);
}

void quicksort(int array[],int leng){
    subquicksort(array,0,leng);
}



int main(){

    int nums[] = {5,4,3,2,1};
    quicksort(nums, 5); \\use the quicksort function and print out the values sorted
    for(int i=0;i<6;i++){
        printf("%d",nums[i]);
    }
    return 0;
}

【问题讨论】:

  • 使用标准 qsort(3)。如果是作业:编译所有警告和调试信息 (gcc -Wall -Wextra -g) 然后使用调试器 (gdb)
  • 是的,你的代码很难看。
  • 好的,我会尝试格式化
  • 1) 在第一个 for 循环 for(int i=start + 1; i &lt; leng; i++){ : i &lt; leng; 应该是 i &lt; end 2) i&lt;6 --> i&lt;5
  • 3) 在第二个 for 循环 leftlist[i]; : i 从 0 开始。

标签: c c99


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>

void subquicksort(int array[], int start, int end){
    int leng=end-start;

    if(leng<=1){
        return;
    }

    int pivot=array[start];
    int leftlist[leng];
    int lindex=0;
    int rightlist[leng];
    int rindex=0;

    for(int i=start + 1; i < end; i++){
        if(array[i]<pivot) {
            leftlist[lindex++ ]=array[i];
        } else {
            rightlist[rindex++]=array[i];
        }
    }

    array[start + lindex]=pivot;

    for( int i=0; i < lindex; i++)
        array[start + i]=leftlist[i];
    for(int i=0; i < rindex; i++)
        array[start + lindex + 1 + i]=rightlist[i];

    subquicksort(array,start,start+lindex);
    subquicksort(array,start+lindex+1,end);
}

void quicksort(int array[],int leng){
    subquicksort(array,0,leng);
}

int main(){
    int nums[] = {5,4,3,2,1};
    quicksort(nums, 5);
    for(int i=0;i<5;i++){
        printf("%d ",nums[i]);
    }
    return 0;
}

【讨论】:

  • 虽然您可能已经解决了这个问题,但仅代码的答案是不受欢迎的,而且这足够长,我发现很难立即发现发生了什么变化。如果这就是您所做的全部更改,您可能应该将您的 cmets 复制到答案中。
  • @MooingDuck 已经对问题发表评论(即修复)。引用原代码太严重了。
  • @BLUEPIXY 我明白了,我的第二个 for 循环应该是 i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多