首页 > 解决方案 > 我已多次调用此函数以正确排序记录结构中的元素

问题描述

我正在学习 C,并且正在编写一个存储记录的基本程序。当我尝试按姓氏的字母顺序对结构数组中的元素进行排序(我不知道我说得对不对)时,我发现我必须多次调用该函数才能使其真正对所有元素进行排序.

我相信问题出在 ret = strcmp(rec[j2].lastname, rec[j2 + 1].lastname); 以及它在代码中的位置。它运行一次并对数组中的两个元素进行排序,但我必须多次调用该函数才能使其完全排序。我已经尝试将该行放在它自己的 for() 循环和 while() 循环中,但我还没有找到解决方案。

 typedef struct rec {
    int recordnumber;
    char firstname[20];
    char lastname[20];
    int age;
    char gender;
} record; 

void SortArr(record* rec, int numrecsread) 
{ 
    int sortchoice;
    int i2, j2, temp, ret;
    record *r1, *r2;
    record trec;

    printf("Press 1 to sort by record number or press 2 to sort by last name.\n");
    scanf("%d", &sortchoice);


    if (sortchoice == 1)
    {
        printf("You have chosen to sort record numbers in ascending order...\n");
        for (i2 = 1; i2 < numrecsread; i2++)
        {
            for (j2 = 0; j2 < numrecsread - 1; j2++)
            {
                if (rec[j2].recordnumber > rec[i2].recordnumber)
                {
                    Swap(&rec[i2], &rec[j2]);

                }
            }
        }
    }
    else if (sortchoice == 2) 
    { 
        printf("You have chosen to sort last names alphabetically...\n");

        for (i2 = 1; i2 < numrecsread; i2++)
        {
            for (j2 = 0; j2 < numrecsread - 1; j2++)
            {
                ret = strcmp(rec[j2].lastname, rec[j2 + 1].lastname); //this has to be called multiple times to fully sort
                if (ret > 0)
                {

                    Swap(&rec[i2], &rec[j2]);

                }
            }
        }

    }
    else if (sortchoice < 1 || sortchoice > 2)
    {
        printf("Invalid input.\n");
    }

}

现在我有四个记录存储在我的数组中。预期的结果是,只需一次调用该函数,它们就会按姓氏的字母顺序排序。按记录编号进行数字排序可以正常工作。

标签: cloopssorting

解决方案


这是一个用c语言进行的算法,用于执行“冒泡”排序。

请注意发布的代码和冒泡排序算法之间的巨大差异。

注意:还有很多其他的排序算法,但 OP 发布的代码不是其中之一。

// A function to implement bubble sort 
void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       

       // Last i elements are already in place    
       for (j = 0; j < n-i-1; j++)  
           if (arr[j] > arr[j+1]) 
              swap(&arr[j], &arr[j+1]); 
} 

上述算法来自:冒泡排序


推荐阅读