获取一系列排序的小写字母

Get a series of lower case letters sorted

该算法适用于整数,但自从我将它们转换为 char 后,它一直在为输出打印 null:

/* sort a series of lower case letters using quicksort algorithm. */ 
#include <stdio.h>

#define N 10

// since c gets the ascii code when returning an int for a char variable.

char quicksort(char a[], char low, char high);
char split(char a[], char low, char high);
int a[N];

int main(void)
{
    int i;

    printf("Enter  letters to be sorted: ");
    for (i = 0; i < N; i++)
        scanf("%d", &a[i]);
    quicksort(a, 0, N - 1);

    printf("In sorted order: ");
    for (i = 0; i < N; i++)
        printf("%s ", a[i]);
    printf("\n");

    return 0;
}
char quicksort(char a[], char low, char high)
{
    int middle;

    if (low >= high) return;
    middle = split(a, low, high);
    quicksort(a, low, middle - 1);
    quicksort(a, middle + 1, high);
}
char split(char a[], char low, char high)
{
    char part_element = a[low];

    for (;;) {
        while (low < high && part_element <= a[high])
            high--;
        if (low >= high) break;
        a[low++] = a[high];

        while (low < high && a[low] <= part_element)
            low++;
        if (low >= high) break;
        a[high--] = a[low];
    }

    a[high] = part_element;
    return high;
}

scanf 需要 %c 格式说明符。您的 scanf 应该更改为

scanf("%c", &a[i]);

因此,您应该将 a 数组重新声明为 char,而不是 int

三期:

  1. a 声明为 int 的数组,但您的所有函数都处理 char 的数组。这意味着它们不会正确地遍历数组。将其更改为 char a[N].
  2. 要读取字符,请使用 %c 格式说明符 scanf
  3. 要打印字符,请使用 %c 格式说明符 printf

The revised code still doesnt work and i cant seem to find the bug.

您的问题似乎出在 main() 上,这与其他人关于使用面向 char 的数据而不是 int 的建议非常相似。有一些非致命的可疑选择问题,例如对数组索引使用 char 数据类型; quicksort() 声明为 return char 但 return 什么都没有;等等。下面是您的代码的返工,主要是为了风格,结合了各种人的建议:

/* sort a series of letters using quicksort algorithm. */ 

#include <stdio.h>

#define N (10)

void quicksort(char a[], int low, int high);
int split(char a[], int low, int high);

int main(void)
{
    char a[N];

    printf("Enter letters to be sorted: ");

    for (int i = 0; i < N; i++) {
        scanf("%c", &a[i]);
    }

    quicksort(a, 0, N - 1);

    printf("In sorted order: ");

    for (int i = 0; i < N; i++) {
        printf("%c ", a[i]);
    }
    printf("\n");

    return 0;
}

void quicksort(char a[], int low, int high)
{
    if (low < high) {
        int middle = split(a, low, high);
        quicksort(a, low, middle - 1);
        quicksort(a, middle + 1, high);
    }
}

int split(char a[], int low, int high)
{
    char part_element = a[low];

    for (;;) {
        while (low < high && part_element <= a[high]) {
            high--;
        }
        if (low >= high) {
            break;
        }
        a[low++] = a[high];

        while (low < high && a[low] <= part_element) {
            low++;
        }
        if (low >= high) {
            break;
        }
        a[high--] = a[low];
    }

    a[high] = part_element;

    return high;
}

它没有做它应该做的一切吗?

示例

> ./a.out
Enter letters to be sorted: aadircslne
In sorted order: a a c d e i l n r s 
>