我想对一组字符进行排序。但是,每次运行程序时,它都会在达到QuickSort功能时崩溃。导致这种影响的可能是什么错误?我正在使用指针数组来排序数组。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void print(char** A, int n){
int i = 0;
for (i = 0; i < n; i++){
printf("%s\n", A[i]);
}
}
int Partition(char** A, int p, int r){
char *temp = (char*)malloc(sizeof(char)*30);
char *x = (char*)malloc(sizeof(char)*30);
x = A[r];
int i = p - 1;
int j = 0;
for(j = p; j<=r; j++){
if(strcmp(A[j],x) <=0){
i=i+1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
if(i<r){
return i;
}else{
return i-1;
}
free(temp);
free(x);
}
void QuickSort(char** A, int p, int r){
if(p<r){
int q = Partition(A, p, r);
QuickSort(A, p, q);
QuickSort(A, q+1, r);
}
}
int main(){
int i = 0;
char **A = (char**) malloc(12*sizeof(char*));
for(i = 0; i < 12; i++){
A[i] = (char*) malloc(sizeof(char)*30);
}
strcpy(A[0], "imarr");
strcpy(A[1], "ikak");
strcpy(A[2], "agh");
strcpy(A[3], "ogss");
strcpy(A[4], "alllll");
strcpy(A[5], "ackm");
strcpy(A[6], "plccc");
strcpy(A[7], "strrr");
strcpy(A[8], "raat");
strcpy(A[9], "omhhh");
strcpy(A[10], "rrors");
strcpy(A[11], "basds");
QuickSort(A, 0, 12);
print(A, 12);
free(A);
return 0;
}
答案 0 :(得分:1)
替换
QuickSort(A, 0, 12);
与
QuickSort(A, 0, 11);
编译并运行它,然后考虑一下。我想你应该足够聪明,弄清楚为什么12是不正确的,而11是可以的。
顺便说一下,我认为这个问题真的应该转到https://codereview.stackexchange.com/
已编辑:抱歉,我最初没有注意到这个问题:
在Partition
这三条线很奇怪:
char *x = (char*)malloc(sizeof(char)*30);
x = A[r];
......
free(x);
没有问题(意味着没有崩溃,而实际上是内存泄漏,因为分配的x
没有被释放,并且A
被错误地释放)在这种情况下,因为数组A
也分配了malloc
此外,当您在交换时使用temp
作为保持值char*
的变量时,不需要分配内存。请参阅已编辑的代码:
int Partition(char** A, int p, int r){
char *temp;
char *x = A[r];
int i = p - 1;
int j = 0;
for(j = p; j<=r; j++){
if(strcmp(A[j],x) <=0){
i=i+1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
if(i<r){
return i;
}else{
return i-1;
}
}
答案 1 :(得分:0)
http://algs4.cs.princeton.edu/23quicksort/
void quick_sort (int *a, int n) {
if (n < 2)
return;
int p = a[n / 2];
int *l = a;
int *r = a + n - 1;
while (l <= r) {
if (*l < p) {
l++;
}
else if (*r > p) {
r--;
}
else {
int t = *l;
*l = *r;
*r = t;
l++;
r--;
}
}
quick_sort(a, r - a + 1);
quick_sort(l, a + n - l);
}
int main () {
int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
int n = sizeof a / sizeof a[0];
quick_sort(a, n);
return 0;
}