簡體   English   中英

C 插入排序不是從小到大排序

[英]C insertion sort not sorting from least to greatest

我有一個插入排序,它在對整數進行排序時可以正常工作,但是我不得不更改它以對不同項目的結構數組進行排序。 數組是10個人的名字和年齡。 該數組首先傳遞給一個排序 function 然后設置一個 for 循環來遍歷該數組。 我認為我遇到的問題是數組沒有正確循環,因為新數組的打印順序仍然是混亂的。 這是我的代碼......

#include <stdio.h>

#define SWAP(x,y) do {typeof(x) SWAP = x; x=y; y=SWAP;} while (0)


typedef struct Person{
        int age;
        char name[10];

}Person;

//-----------------------------

void sort(Person* arr,int n){

    int i, x, y;
    for (i=1;i<n;i++){
        x=arr[i].age;
        y = i-1;

        while(y>=0 && arr[y].age > x){
                arr[y+1]=arr[y];
                y=y-1;
        }
        SWAP(arr[y+1],arr[i]);
    }
}

int main(){

    struct Person p1 = {26, "devin"};
    struct Person p2 = {28, "bob"};
    struct Person p3 = {22, "derric"};
    struct Person p4 = {20, "amy"};
    struct Person p5 = {19, "melvin"};
    struct Person p6 = {17, "ashley"};
    struct Person p7 = {31, "haley"};
    struct Person p8 = {32, "larry"};
    struct Person p9 = {24, "ben"};
    struct Person p10 = {40, "bobby"};


    struct Person arr[] = {p1,p2,p3,p4,p5,p6,p7,p8,p9,p10};

    int n = sizeof(arr)/sizeof(arr[0]);

    printf("--Array Before Sort--\n");
    print(arr, n);

    printf("--Array After Sort--\n");
    sort(arr,n);

    //printf("\n--Sorted Array--\n");
    print(arr,n);
}

該代碼缺少打印 function,因為我相信它工作正常並且我正在嘗試壓縮我需要幫助的內容。 我認為問題出在排序 function 中的 for 和 while 循環中。這是 output...

--Array Before Sort--
26 devin, 28 bob, 22 derric, 20 amy, 19 melvin, 17 ashley, 31 haley, 32 larry, 24 ben, 40 bobby, 
--Array After Sort--
32 larry, 28 bob, 28 bob, 28 bob, 28 bob, 26 devin, 28 bob, 31 haley, 32 larry, 40 bobby, 

這些名字應該按照從小到大的順序排列。 有任何想法嗎?

你只需要做一些小的改變來排序 function:

void sort(Person* arr, int n)
{
    int i, y;
    for (i = 1; i < n; i++){
        Person x = arr[i];
        y = i - 1;

        while (y >= 0 && arr[y].age > x.age){
                arr[y + 1] = arr[y];
                y = y - 1;
        }
        SWAP(arr[y + 1], x);
    }
}

我也會替換SWAP(arr[y+1], x); 只有arr[y+1] = x; 因為它使代碼更具可讀性,並且可能對整體性能更好。

我建議不要錯誤地編寫排序 function,而是花時間學習如何使用經過測試的標准庫函數,例如qsort() 遍歷 arrays 和交換元素的練習很好,但是您很快就會遇到其他挫折,這些挫折會不必要地浪費寶貴的時間。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int age;
    char name[10];
} Person_t;

void print( Person_t p[], size_t n ) {
    for( size_t i = 0; i < n; i++ )
        printf( "#%d: %s %d\n", i, p[i].name, p[i].age );
}

int cmpAge( const void *p1, const void *p2) {
    return ((Person_t*)p1)->age - ((Person_t*)p2)->age;
}

int cmpNam( const void *p1, const void *p2) {
    return strcmp( ((Person_t*)p1)->name, ((Person_t*)p2)->name );
}

int main(){
    Person_t arr[] = {
        {26, "devin"},
        {28, "bob"},
        {22, "derric"},
        {20, "amy"},
        {19, "melvin"},
        {17, "ashley"},
        {31, "haley"},
        {32, "larry"},
        {24, "ben"},
        {40, "bobby"},
    };
    int n = sizeof arr/sizeof arr[0];

    printf("--Array Before Sort--\n");
    print(arr, n);

    qsort( arr, n, sizeof arr[0], cmpAge );
    printf("--Array After age Sort--\n");
    print(arr,n);

    qsort( arr, n, sizeof arr[0], cmpNam );
    printf("--Array After name Sort--\n");
    print(arr,n);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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