[英]How to sort an array of structures based on a field in the structures? (in C)
我有一個程序,將有關 10 所大學的各種信息存儲為數組中的結構。 我有一個名為“inputData”的 function,它通過將大學的信息轉換為結構來將它們加載到數組中。 我正在嘗試編寫一個 function,它將按學費(從最高到最低)對大學進行排序。 我嘗試使用選擇排序來執行此操作,但我一直在某個地方遇到錯誤。
這是結構:
struct University
{
char name[50];
char city[20];
char state[3];
int rank;
int tuition;
};
這是 function 將信息轉換為結構:
struct University inputData(char Name[50], char City[20], char State[3], int Rank, int Tuition){
struct University uni;
strcpy(uni.name, Name);
strcpy(uni.city, City);
strcpy(uni.state, State);
uni.rank=Rank;
uni.tuition=Tuition;
return uni;
};
然后我創建了一個結構數組並添加了所有信息:
struct University university[10];
university[0]= inputData("Princeton University", "Princeton", "NJ", 1, 45320);
university[1]= inputData("University of Virginia", "Charlottesville", "VA", 24, 52040);
university[2]= inputData("Boston College", "Chestnut Hill", "MA", 31, 51296);
university[3]= inputData("Georgia Institute of Technology", "Atlanta", "GA", 34, 32404);
university[4]= inputData("Lehigh University", "Bethlehem", "PA", 44, 48320);
university[5]= inputData("University of Chicago", "Chicago", "IL", 3, 52491);
university[6]= inputData("Duke University", "Durham", "NC", 8, 51265);
university[7]= inputData("University of Georgia", "Athens", "GA", 56, 29844);
university[8]= inputData("University of Denver", "Denver", "CO", 86, 46362);
university[9]= inputData("Loyola University Chicago", "Chicago", "IL", 99, 26270);
我正在嘗試使用此 function (使用選擇排序)進行排序:
void printSortedUniversity(struct University* list){
int i, j, max_idx;
for (i = 0; i < 9; i++)
{
max_idx = i;
for (j = i+1; j < 10; j++)
if (list[j].tuition > list[max_idx].tuition)
max_idx = j;
swap(&list[max_idx], &list[i]);
}
for (i=0; i<10; i++){
printInfo(list[i]);
printf("\n");
}
};
這是交換 function:
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
我不斷得到:
姓名:Univceton 大學城市:普林斯頓 State:NJ 排名:1 學費:45320
姓名:弗吉尼亞城王子:夏洛茨維爾 State:弗吉尼亞州排名:24 學費:52040
姓名: Univon College City: Chestnut Hill State: MA 排名: 31 學費: 51296
姓名:波斯特賈理工學院城市:亞特蘭大 State:GA 排名:34 學費:32404
姓名:喬治大學城市:伯利恆 State:PA 排名:44 學費:48320
姓名:芝加哥市議會:芝加哥 State:IL 排名:3 學費:52491
姓名:杜克大學城市:達勒姆 State:NC 排名:8 學費:51265
名稱:喬治亞大學城市:雅典 State:GA 排名:56 學費:29844
姓名:丹佛市大學:Denver State:CO 排名:86 學費:46362
名稱:芝加哥洛約拉大學城市:芝加哥 State:IL 排名:99 學費:26270
我不明白為什么名稱會損壞以及為什么排序不起作用? 我認為這是因為修改后的列表沒有存儲在任何地方,但我不知道如何解決這個問題。 任何幫助,將不勝感激。 謝謝你
你交換 function 應該是
void swap(struct University *x, struct University *y)
{
struct University temp = *x;
*x = *y;
*y = temp;
}
這給出了預期的 output:
Name: University of Chicago City: Chicago Rank: 3 Tuition: 52491
Name: University of Virginia City: Charlottesville Rank: 24 Tuition: 52040
Name: Boston College City: Chestnut Hill Rank: 31 Tuition: 51296
Name: Duke University City: Durham Rank: 8 Tuition: 51265
Name: Lehigh University City: Bethlehem Rank: 44 Tuition: 48320
Name: University of Denver City: Denver Rank: 86 Tuition: 46362
Name: Princeton University City: Princeton Rank: 1 Tuition: 45320
Name: Georgia Institute of Technology City: Atlanta Rank: 34 Tuition: 32404
Name: University of Georgia City: Athens Rank: 56 Tuition: 29844
Name: Loyola University Chicago City: Chicago Rank: 99 Tuition: 26270
筆記
這是一種效率極低的排序。 沒有人會在生產代碼中這樣做。
正如David Cullen在他們的回答中寫到的關於swap()
function 的那樣,根據tuition
交換結構的swap()
function 將是:
void swap(struct University *x, struct University *y)
{
struct University temp = *x;
*x = *y;
*y = temp;
}
你的printSortedUniversity()
function 應該是這樣的:
void printSortedUniversity(struct University* list){
int i, j, max_idx;
for (i = 0; i < 9; i++)
{
max_idx = i;
for (j = i+1; j < 10; j++)
if (list[j].tuition > list[max_idx].tuition)
max_idx = j;
if(i != max_idx)
swap(&list[max_idx], &list[i]);
}
for (i=0; i<10; i++){
printInfo(list[i]);
// printf("%d\n",list[i].tuition);
printf("\n");
}
}
這對我有用:
使用此交換 function:
void swap(struct University *p, struct University *q) //function to swap list items
{
struct University hold = *p;
*p = *q;
*q = hold;
}
而且我沒有更改 printSortedUniversity function:
void printSortedUniversity(struct University* list){ int i, j, max_idx;
for (i = 0; i < 9; i++)
{
max_idx = i;
for (j = i+1; j < 10; j++)
if (list[j].tuition > list[max_idx].tuition)
max_idx = j;
swap(&list[max_idx], &list[i]);
}
for (i=0; i<10; i++){
printInfo(list[i]);
printf("\n");
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.