我正在学习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");
}
}
现在我在main中的数组中存储了四个记录。预期的结果是,在对函数的一次调用中,它们按姓氏的字母顺序排序。按记录号按数字排序可以正常工作。
答案 0 :(得分:0)
这是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]);
}
以上算法来自:bubble sort