C言語,qsort()関数で数値を昇順や降順にソートする

スポンサーリンク

鍛錬 730

C言語,qsort()関数で数値を昇順や降順にソートする

数値の配列を昇順や降順にソートする(並び替える)手段として、qsort()関数を使用する方法があります。

関連記事:C言語,qsort()関数で文字列を昇順や降順にソートする
 
以下は、qsort()関数についてです。

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
 

引数

以下は、上記の引数についてです。

引数 意味
void *base ソートする配列の先頭へのポインタ
size_t nmemb 配列の要素数
size_t size 要素の大きさ
int (*compar)(const void *, const void *) 比較関数

戻り値

qsort()関数の戻り値はありません。

比較関数は、以下のルールで戻り値を返す必要があります。

戻り値
int 第1引数 < 第2引数である場合 負の整数
int 第1引数と第2引数が等しい場合 0
int 第1引数 > 第2引数 である場合 正の整数
スポンサーリンク

プログラム

以下は、数値の配列を昇順と降順にソートするプログラム、qsort_num.c です。

今回は、-5 ~ 5 の範囲で数値をソートしています。

// include
#include <stdio.h>
#include <stdlib.h>

// prototype
int SortAscendNum(const void *num1, const void *num2);
int SortDescendNum(const void *num1, const void *num2);

// main
int main(void)
{
	int num[] = {3, -1, -5 ,0, 4, -2, 1, 5, 2, -4, -3};
	unsigned int elmt;
	size_t cnt;
	
	// ソート対象の要素数を格納
	cnt = sizeof(num) / sizeof(int);
	
	printf("ソート前\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%d] ", num[elmt]);
	}
	printf("\n");
	printf("\n");
	
	// 数値を昇順でソート
	qsort(num, cnt, sizeof(int), SortAscendNum);
	printf("昇順でソート\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%d] ", num[elmt]);
	}
	printf("\n");
	printf("\n");
	
	// 数値を降順でソート
	qsort(num, cnt, sizeof(int), SortDescendNum);
	printf("降順でソート\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%d] ", num[elmt]);
	}
	printf("\n");
	
	return 0;
}

// =======================================
// @brief  数値を昇順でソートする
// @param  num1 [in],比較対象1
// @param  num2 [in],比較対象2
// @return 負 比較対象1の方が小さい
// @return 0  比較対象1と比較対象2が等しい
// @return 正 比較対象1の方が大きい
// @note   無し
// =======================================
int SortAscendNum(const void *num1, const void *num2)
{
	return *(int *)num1 - *(int *)num2;
}

// =======================================
// @brief  数値を降順でソートする
// @param  num1 [in],比較対象1
// @param  num2 [in],比較対象2
// @return 負 比較対象2の方が小さい
// @return 0  比較対象1と比較対象2が等しい
// @return 正 比較対象2の方が大きい
// @note   無し
// =======================================
int SortDescendNum(const void *num1, const void *num2)
{
	return *(int *)num2 - *(int *)num1;
}
スポンサーリンク

実行結果

以下は、プログラム qsort_num.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra qsort_num.c -o qsort_num
***@ubuntu:~/***/test/c$ ./qsort_num
ソート前
[3] [-1] [-5] [0] [4] [-2] [1] [5] [2] [-4] [-3] 

昇順でソート
[-5] [-4] [-3] [-2] [-1] [0] [1] [2] [3] [4] [5] 

降順でソート
[5] [4] [3] [2] [1] [0] [-1] [-2] [-3] [-4] [-5]

 
上記に示した通り、数値を昇順と降順にソートすることができました。

タイトルとURLをコピーしました