arrays - 在c中使用通用快速排序对char**数组进行排序
问题描述
我目前正在对我制作的通用快速排序进行单元测试,我将在下面发布代码,以及我正在使用的比较方法以及我正在运行以测试它的代码。
我发现的问题是数组实际上没有被排序。断言失败,如果我在排序后尝试打印数组,它只会按预定顺序打印值。
我尝试对 int 和 float 值的算法进行单元测试,它的排序很好。
我相信问题可能在于我可能没有正确转换 void 指针,导致未定义的行为
void quicksort(void* pointer, int size, int start, int end, int (*compare)(void*,void*)){
if(end > start){
int index = partition(pointer, size, start, end,compare);
quicksort(pointer,size,start,index-1,compare);
quicksort(pointer,size,index+1,end,compare);
}
}
int partition(void * pointer, int size, int start, int end, int (*compare)(void*,void*)){
int beginning = start + 1;
int ending = end;
while(beginning <= ending){
if(compare(&pointer[beginning*size],&pointer[start*size]) >= 0){
beginning++;
}
else{
if(compare(&pointer[ending*size],&pointer[start*size]) == -1){
ending--;
}
else{
swap(&pointer[beginning*size],&pointer[ending*size],size);
beginning++;
ending--;
}
}
}
swap(&pointer[start*size],&pointer[ending*size],size);
return ending;
}
void swap(void* datablocka, void* datablockb, size_t elem_size){
char temp;
char *chara = datablocka;
char *charb = datablockb;
while(elem_size--){
temp = chara[elem_size];
chara[elem_size] = charb[elem_size];
charb[elem_size] = temp;
}
}
int compare_string(void* first, void* second){
char * a = first;
char * b = second;
int compare = strcmp(a,b);
if (compare < 0) return 1;
else if(compare == 0) return 0;
else return -1;
}
void quicksort_string_utest() {
char* a[] = {"a","aaa","abba","mime","pippo","cacciatorpediniere"};
char* b[] = {"a","aaa","abba","cacciatorpediniere","mime","pippo"};
int end = (sizeof(a)/sizeof(a[0]))-1;
quicksort(a, sizeof(a[0]), 0, end, compare_string );
for(int i = 0; i < 6; i++){
assert(strcmp(a[i],b[i]) == 0);
}
}
我真的很感谢你的帮助,因为你可以看到我无法解决这个问题
解决方案
在这个程序中,传递给比较函数compare_string
的是指向数组元素的指针。
在这种情况下,数组的元素是char*
并且传递的是指向 的指针char*
。
因此,要获取指向字符串的指针,您必须取消引用传递的指针。
尝试这个:
int compare_string(void* first, void* second){
char ** a = first;
char ** b = second;
int compare = strcmp(*a,*b);
if (compare < 0) return 1;
else if(compare == 0) return 0;
else return -1;
}
推荐阅读
- swift - 防止在swift 5中粘贴到文本字段中
- c# - 如何为 sl5 目标框架构建 SDK 风格的项目?
- android - 如何在 react-native 的函数内部组件中使用变量?
- python - GluonCV ImportError:无法导入名称“is_np_array”
- python-3.x - 如果在单元格 A1 中找到字符串,则在 B1 单元格中替换 python pandas
- scala - Spark(scala):如何将 UDF 转换应用于嵌套数据中的数组列
- reactjs - React 类组件中的“Timer”类型上不存在 this.setinterval
- javascript - javascript中 Math.floor() 的第二个参数有什么用?
- javascript - 如何通过 shopify 页面视图触发 zap?
- ionic-framework - 希望将我的 ionic 4 项目与 pouchdb 连接起来。但不断收到错误“无法访问词法声明”