1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

qsort関数について

Last updated at Posted at 2022-01-12

#はじめに
この記事はC言語初心者がqsort関数についてまとめたものです。
至らないところもあるかと思いますがご容赦ください。

#qsort関数とは
qsort関数とはクイックソートと呼ばれる高速な並び替えで配列を並び替える関数です。
どんな型でも並び替えが可能ですが比較関数は自作する必要があります。

#使用方法
###定義

#include <stdlib.h>

void qsort(void* head, size_t num, size_t size, int(*cmp)(const void*, const void*));

最初にqsortが宣言されているstdlib.hをインクルードします。
この関数には戻り値がありませんので戻り値の型はvoidになります。
###引数
・第1引数 head:ソートする配列の先頭アドレス
・第2引数 num:ソートする配列の要素数
・第3引数 size:ソートする配列のデータ一つ分のバイト数
・第4引数 cmp:ソートをするための比較関数へのアドレス
###サンプルコード
int型の配列を昇順にソートしてみます。

#define _CRT_SECRE_NO_WARNINGS 
#include <stdlib.h>
#include<stdio.h>

//比較関数(昇順)
int cmp(const void* x, const void* y)
{
	if (*(int*)x > * (int*)y)
	{
		return 1;
	}
	else if (*(int*)x < *(int*)y)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

int main(void)
{
	//ソート対象データ
	int num[] = { 70,10,30,50,20,90,100,80,40,60 };
	int i;

	//並べ替え
	qsort(num, 10, sizeof(int), cmp);

	//結果の表示
	for (i = 0; i < 10; i++)
	{
		printf("%d ", num[i]);
	}
}

実行結果

10 20 30 40 50 60 70 80 90 100

qsort関数は比較関数の戻り値をもとにソートします。
昇順の場合、戻り値は下記のようになります。
・x<yの時は0より小さい数値
・x>yの時は0より大きい数値
・x==yの時は0
また、降順の場合は正負の戻り値を逆転することで実現可能です。

if (*(int*)x > * (int*)y)
	{
		//昇順では1
		return -1;
	}
	else if (*(int*)x < *(int*)y)
	{
		//昇順では-1
		return 1;
	}
	else
	{
		//ここは変わらない
		return 0;
	}

実行結果

100 90 80 70 60 50 40 30 20 10

#まとめ
ソートを実装するよりqsort関数を利用することによって簡単にクイックソートを実現することができる。どんな型でもソートが可能なのが魅力的。

#最後に
今回はqsort関数について簡単にまとめてみました。
知識不足なところがまだまだたくさんあるのでこれからも勉強を続けていきます。
最後まで読んでいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?