Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用分区和交换按字母顺序排序_C_Sorting_Partitioning_Arrays_Alphabetical - Fatal编程技术网

C 使用分区和交换按字母顺序排序

C 使用分区和交换按字母顺序排序,c,sorting,partitioning,arrays,alphabetical,C,Sorting,Partitioning,Arrays,Alphabetical,因此,我的程序使用分区排序将10个用户输入的名称按字母顺序重新打印。我以前从未使用过分区排序,所以我完全没有经验来解决这个问题 我正在使用一个数字分区排序的示例,并尝试使用strcmp对其进行排序 我下面的大部分代码都是我的,除了分区函数,这是我遇到的问题。有人能帮我了解一下这种排序方法是如何工作的,以及我如何操作它以字母顺序对10个名字进行排序的吗 #include <stdio.h> #include <time.h> #include <stdlib.h>

因此,我的程序使用分区排序将10个用户输入的名称按字母顺序重新打印。我以前从未使用过分区排序,所以我完全没有经验来解决这个问题

我正在使用一个数字分区排序的示例,并尝试使用strcmp对其进行排序

我下面的大部分代码都是我的,除了分区函数,这是我遇到的问题。有人能帮我了解一下这种排序方法是如何工作的,以及我如何操作它以字母顺序对10个名字进行排序的吗

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

#define DEBUG_LEVEL 0

int partition(int a[], int left, int right);
void swap(int *a, int *b);

#define SIZE    10

int main(int argc, const char * argv[]) {

char Names[10][10];
int count = 10;
int i;
int a[SIZE];

printf("Enter 10 names:");
for (i=0; i < count; ++i)
{
    gets(Names[i]);
}
printf("\n\n");
partition(a, 0, SIZE -1);
printf("The names in alphabetical order are\n");
for (i=0; i< count; ++i)
{
    printf("%s\n",Names[i]);
}
getchar();
}

 int partition(int a[], int left, int right) {
int i, j, key;

key = a[left];
i = left + 1;
j = right;
   while (strcmp(i, j) <0) {
while (i <= right && a[i] <= key)
 ++i;
 while (j >= left && a[j] > key)
 --j;
 if (i < j)
 swap(&a[i], &a[j]);
    }
    swap(&a[left], &a[j]);
    return j;
 }

void swap(int *a, int *b)   {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
#包括
#包括
#包括
#定义调试级别0
int分区(inta[],int左,int右);
无效掉期(int*a、int*b);
#定义尺寸10
int main(int argc,const char*argv[]{
字符名称[10][10];
整数计数=10;
int i;
int a[大小];
printf(“输入10个名称:”);
对于(i=0;i而(strcmp(i,j)可以在Wikipedia上找到这种分区排序方法的简短解释,其中有一篇长文章的链接:

由于chux所述的原因以及缺少子分区的递归调用,所示代码无法工作。以下是一个工作版本:

void swap(char a[10], char b[10])
{
    char temp[10];
    strcpy(temp, a);
    strcpy(a, b);
    strcpy(b, temp);
}

void partition(char Names[][10], int left, int right)
{
    int i, j;
    char *key;
    if (right <= left) return;

    key = Names[left];
    i = left+1;
    j = right;
    for (; ; )
    {
        while (i <= right && strcmp(Names[i], key) <= 0) ++i;
        while (j >= left  && strcmp(Names[j], key) >  0) --j;
        if (i < j) swap(Names[i], Names[j]);
        else     { swap(     key, Names[j]); break; }
    }
    partition(Names, left, j-1);
    partition(Names, i, right);
}
无效交换(字符a[10],字符b[10])
{
煤焦温度[10];
strcpy(温度,a);
strcpy(a,b);
strcpy(b,temp);
}
无效分区(字符名[][10],左整数,右整数)
{
int i,j;
字符*键;

如果(右1)当代码调用
分区(a,0,SIZE-1);
时,
a
的内容未初始化。2)
i
,j,`are
int
。调用
strcmp((i,j)
没有任何意义。是的,就像我说的,我所做的是复制这个分区段,然后将它添加到我的代码中,希望我能对它进行操作,使其对单词进行排序。使用快速排序而不是分区排序会更容易吗?我很感激你的提示,但我还是迷路了,因为这是我第一次被引导对t进行排序hr通过任何方法@Chux,这不是排序的入门问题。
strcmp()
是一个以2个字符串为地址的函数。传递2
int
没有意义。当然,您的编译器必须(或应该)提供警告。发布随时发出警告的代码意味着1)您没有编译代码(这是一个主要的问题)2)没有启用警告(全部启用)3)使用一个古老的编译器(获取一个新的)或4)忽略这些警告(阅读并执行)。