首頁 > 軟體

C語言對結構體陣列按照某項規則進行排序的實現過程探究

2023-02-03 18:00:45

這是基於qsort()函數進行的簡單排序。(附帶其他型別的陣列使用qsort()進行的排序)

前言

基於qsort()函數進行的排序最有用的莫過於在此對於結構體陣列進行排序了。此外,若能結合函數指標,更是能夠實現“想降就降,想升就升”的美好局面。

一、qsort()函數

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );(來源msdn)

base:傳過去的陣列

num:陣列中元素的個數

width:陣列中每個元素有多大

compare():此函數指標是需要自己實現的、根據什麼規則進行的排序函數

二、compare()函數

須根據需要對於引數進行指標型別的轉化。

若對字元型陣列進行排序,那就轉換成字元型指標。(char*)

若對整型陣列進行排序,那就轉換成整型指標。(int*)

若對浮點型陣列進行排序,那就轉換成浮點型指標。(float*)

若對結構體陣列的某項進行排序,那就轉換成結構體指標。(struct xxx*)

1.結構體陣列

返回的是兩個結構體指標解除參照後相比較的結果。

1)升序實現

程式碼如下(範例):

int Ascend(const void* p1, const void* p2)
{
	const stu* x = p1;
	const stu* y = p2;
	// 對於結構體進行二級排序:
	// 如果年齡相等,誰成績高誰在前面
	if (x->age == y->age)
	{
		return (x->score < y->score);
	}
	else
	{
		return (x->age < y->age);
	}
}

2)降序實現

程式碼如下(範例):

int Descend(const void* p1, const void* p2)
{
	const stu* x = p1;
	const stu* y = p2;
	// 對於結構體進行二級排序:
	// 如果年齡相等,誰成績高誰在前面
	if (x->age == y->age)
	{
		return (x->score < y->score);
	}
	else
	{
		return (x->age < y->age);
	}
}

2.整型陣列

返回的是兩個int指標解除參照後相減的結果。(用三目運運算元+大於小於號也可以)

為什麼不直接返回a>b(a<b)?

如下圖:因為qsort()在判斷時是需要判斷兩個引數誰大誰小,是需要一個正數或者負數的,但是直接返回a>b(a<b)的話,這個表示式的值只有0和非0,非0會被認為是相等,從而不進行交換。

1)升序實現

程式碼如下(範例):

void ArrComp(const void* p1, const void* p2)
{
	const int* x = p1;
	const int* y = p2;
	return *x - *y;
}

2)降序實現

程式碼如下(範例):

void ArrDescend(const void* p1, const void* p2)
{
	const int* x = p1;
	const int* y = p2;
	return *y - *x;
}

3.浮點型陣列

返回的是兩個float指標解除參照相減的結果,使用三目運運算元進行判斷(目的是為了判斷大小後有個正負)。

1)升序實現

程式碼如下(範例):

void FloatArrAscend(const void* p1, const void* p2)
{
	const float* x = p1;
	const float* y = p2;
	return *x > *y ? 1 : -1;
}

2)降序實現

程式碼如下(範例):

void FloatArrDescend(const void* p1, const void* p2)
{
	const float* x = p1;
	const float* y = p2;
	return *y < *x ? 1 : -1;
}

三、效果圖

總結

qsort()函數原始碼在c庫中使用的是快排進行的排序函數,結合函數指標,可以實現快速地升、降序的排序。

到此這篇關於C語言對結構體陣列按照某項規則進行排序的實現過程探究的文章就介紹到這了,更多相關C語言陣列排序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com