【问题标题】:quicksort algorithm implementaion in cc语言中的快速排序算法实现
【发布时间】:2019-05-01 08:09:36
【问题描述】:

这是c中快速排序算法的实现,对于给定的输入,我的程序给出的输出为4 5 -343534 1,我是编程新手,如果你能指出我的错误,那将非常有帮助

    #include<stdio.h>
    #include<stdlib.h>
    int partition(int* A, int start, int end) {
        int pivot = A[end];
        int pindex = start;
        for (int i = 0; i < end; i++) {
            if (A[i] <= pivot) {
                int temp = A[i];
                A[i] = A[pindex];
                A[pindex] = temp;
                pindex = pindex + 1;
            }
        }
        int temp = A[end];
        A[end] = A[pindex];
        A[pindex] = temp;
        return pindex;
    }
    void quicksort(int* A, int start, int end) {
        if (start < end) {
            int pindex = partition(A, start, end);
            quicksort(A, start, pindex - 1);
            quicksort(A, pindex+1, end);
        }
    }
    int main() {
        int* a = (int*)malloc(sizeof(int) * 4);
        a[0] = 1;
        a[1] = 5;
        a[2] = 4;
        a[3] = 2;
        quicksort(a, 0, 3);
        printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
        system("pause");
    }

【问题讨论】:

  • 我认为一个问题是您没有使用标准的qsort 函数。但如果这是学校(或类似的)作业,那很自然。
  • 至于你展示的代码有问题,建议你learn how to debug your programs
  • 尝试在纸上“执行”代码。
  • 很久没有写过 C 语言了,但是如果我没记错的话,指针分配的数组的工作方式会有所不同。 mathcs.emory.edu/~cheung/Courses/255/Syllabus/2-C-adv-data/… 这可能会让您对问题所在有所了解。
  • 一个明显的错字:for (int i = 0; i &lt; end; i++) { 应该是 for (int i = start; i &lt; end; i++) {

标签: c algorithm sorting


【解决方案1】:

你的问题来自partition函数:

i 变量应该以 start 开头,而不是从 0:

int partition(int* A, int start, int end) 
{
    int pivot = A[end];
    int pindex = start;
    for (int i = start; i < end; i++) {
        if (A[i] <= pivot) {
            int temp = A[i];
            A[i] = A[pindex];
            A[pindex] = temp;
            pindex = pindex + 1;
        }
    }
    int temp = A[end];
    A[end] = A[pindex];
    A[pindex] = temp;
    return pindex;
}

您的代码可以通过某种方式改进:定义一个swap 函数以避免重复自己:

#include<stdio.h>
#include<stdlib.h>
void print_array(int *A, int size)
{
    for (int i = 0; i < size; ++i)
        printf("%d ", A[i]);

    puts("");
}
void swap(int *A, int i, int j)
{
    if (i == j)
        return ;

    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}

int partition(int* A, int start, int end) {
    int pivot = A[end];
    int pindex = start;
    for (int i = start; i < end; i++) {
        if (A[i] <= pivot) {
            swap(A, i, pindex);
            pindex = pindex + 1;
        }
    }
    swap(A, end, pindex);

    return pindex;
}
void quicksort(int* A, int start, int end) {
    if (start < end) {
        int pindex = partition(A, start, end);
        quicksort(A, start, pindex - 1);
        quicksort(A, pindex+1, end);
    }

}
int main() {
    int i, size = 32;
    int* a = malloc(sizeof * a * size);
    for (i = 0; i < size; ++i)
        a[i] = rand()%100;

    print_array(a, size);

    quicksort(a, 0, size-1);

    print_array(a, size);

    return 0;
}

给:

83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 11 68 67 29 82 30 62 23 67 35 29 2 
2 11 15 21 23 26 26 27 29 29 30 35 35 36 40 49 59 62 62 63 67 67 68 72 77 82 83 86 86 90 92 93     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 2023-03-30
    • 1970-01-01
    • 2011-12-18
    • 2022-06-21
    • 2023-01-31
    • 2018-09-20
    • 2011-03-29
    相关资源
    最近更新 更多