我有一個插入排序,它在對整數進行排序時正在作業,但是我必須更改它以對不同專案的結構陣列進行排序。該陣列是 10 個人的姓名和年齡。陣列首先傳遞給排序函式,然后設定一個 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);
}
該代碼缺少列印功能,因為我相信它可以正常作業并且我正在嘗試濃縮我需要幫助的內容。我相信問題出在排序函式中的 for 和 while 回圈中。這是輸出...
--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,
這些名字應該從最年輕到最老排序。有任何想法嗎?
uj5u.com熱心網友回復:
您只需要對排序功能進行一些小改動:
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;因為它使代碼更具可讀性并且可能對整體性能更好。
uj5u.com熱心網友回復:
我建議不要錯誤地撰寫排序函式,而是花時間學習如何使用經過測驗的標準庫函式,例如qsort(). 遍歷陣列和交換元素的練習非常好,但是你很快就會遇到其他不必要的浪費寶貴時間的挫折。
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510498.html
標籤:数组C排序插入排序
