[英]Sorting alphabetically in C using strcmp
我正在尝试按名称对记录(结构)进行排序。 我正在使用 strcmp 进行交换以检测字母顺序。 交换工作正常,但它并不总是对整个列表进行排序。 它总是以不正确的字母顺序留下一些记录。
void sort_by_name(){
printf("%d\n", counter);
int i=0, j=0;
patient *temp;
for(;j<=counter;j++){
for(;i<counter-1;i++){
if(strcmp(pRecords[i]->name, pRecords[i+1]->name) > 0){
temp = pRecords[i];
pRecords[i] = pRecords[i+1];
pRecords[i+1]=temp;
}//if loops
}//2nd for loop
}//1st for loop
}
counter-- number of records in the system.
我认为您的具体问题是每次启动内部循环时都没有将i
重新初始化为 0 。
这是一个相对简单的冒泡排序,其中内部循环在N
个项目的列表上运行N
次(由外部循环控制)以对它们进行排序。 但是你的内部循环运行一次然后似乎 go 在其他地方,超出数组的末尾。 这不太可能提供有用的结果:-)
您更普遍的问题是:您为什么不使用语言工具来执行此操作,特别是qsort
? 如果你想自学排序,那很好,但如果你只是想排序,那么重新发明轮子就没有什么意义了。
对于它的价值,我更喜欢冒泡排序中的以下算法。 如果列表已排序并且它不查看已排序的项目,它会提前停止:
void sort_by_name(){
int i, didSwap = 1, limit = numitems - 1;
patient *temp;
while (didSwap) {
didSwap = 0;
for (i = 0; i < limit; i++) {
if (strcmp (pRecords[i]->name, pRecords[i+1]->name) > 0) {
temp = pRecords[i];
pRecords[i] = pRecords[i+1];
pRecords[i+1] = temp;
didSwap = 1;
}
}
limit--;
}
}
didSwap
变量控制何时退出。 如果您遍历整个未排序的部分而不进行交换,那么显然,您就完成了。 limit
控制未排序的部分并逐渐减少,因为在每次遍历之后,列表末尾有一个更大的已排序部分(较高的元素冒泡到列表的末尾,每次遍历一个)。
我认为您正在尝试实现冒泡排序。 循环计数变量似乎有点偏离。
for(;i<counter-1;i++){
应该
for(i=counter-2;i>=j; i--){
您必须在“j”循环的每次迭代后重置 i。 并向后工作以使最小的数字冒泡到前面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.