[英]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.