日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:36°熨斗的學習日記 ? 更新時間: 2023-03-30 編程語言

這是基于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庫中使用的是快排進行的排序函數,結合函數指針,可以實現快速地升、降序的排序。

原文鏈接:https://blog.csdn.net/leadera_/article/details/128823814

欄目分類
最近更新