C中字符数组的快速排序数组
Quick sorting array of arrays of chars in C
我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个我无法调试的分段错误。这是代码:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (i <= right && strcmp(a[i], pivot) < 0);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
void quickSortChar(char **a, int left, int right)
{
int j;
if (left < right)
{
j = partition(a, left, right);
quickSortChar(a, left, j - 1);
quickSortChar(a, j + 1, right);
}
}
int main()
{
char **arr = (char **)calloc(10, sizeof(char *));
arr[0] = (char *)malloc(16);
arr[1] = (char *)malloc(16);
arr[2] = (char *)malloc(16);
arr[0] = "patata";
arr[1] = "berenjena";
arr[2] = "alioli";
quickSortChar(arr, 0, 2);
}
更新 1
使用strcpy
也不行:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (strcmp(a[i], pivot) < 0 && i <= right);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
更新 2
我通过上移声明解决了警告。
更新 3
修复while (i <= right && strcmp(a[i], pivot) < 0);
请注意,您检查 i
仅在 strcmp(a[i], pivot) < 0
之后没有超过 a
的长度,因此您达到 i=3
然后被丢弃。
改为
while (i <= right && strcmp(a[i], pivot) < 0);
我还建议使用 calloc
而不是 malloc
来初始化 arr
我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个我无法调试的分段错误。这是代码:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (i <= right && strcmp(a[i], pivot) < 0);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
void quickSortChar(char **a, int left, int right)
{
int j;
if (left < right)
{
j = partition(a, left, right);
quickSortChar(a, left, j - 1);
quickSortChar(a, j + 1, right);
}
}
int main()
{
char **arr = (char **)calloc(10, sizeof(char *));
arr[0] = (char *)malloc(16);
arr[1] = (char *)malloc(16);
arr[2] = (char *)malloc(16);
arr[0] = "patata";
arr[1] = "berenjena";
arr[2] = "alioli";
quickSortChar(arr, 0, 2);
}
更新 1
使用strcpy
也不行:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (strcmp(a[i], pivot) < 0 && i <= right);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
更新 2
我通过上移声明解决了警告。
更新 3
修复while (i <= right && strcmp(a[i], pivot) < 0);
请注意,您检查 i
仅在 strcmp(a[i], pivot) < 0
之后没有超过 a
的长度,因此您达到 i=3
然后被丢弃。
改为
while (i <= right && strcmp(a[i], pivot) < 0);
我还建议使用 calloc
而不是 malloc
来初始化 arr