簡體   English   中英

使用 strcmp 在 C 中按字母順序排序

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM