qsort 関数の詳細な説明と、qsort 関数の実装をシミュレートするためのバブル ソートの使用

個人ホームページ:クリックしてホームページに入ります

コラム分類: C言語初級      C言語プログラミング——KTV        C言語ミニゲーム     C言語上級

C言語の試験問題

誰でも「いいね!」、コメント、収集を歓迎します。

一緒に頑張って大きな工場へ一緒に行きましょう。

目次

1.qsort関数

1.1 qsort関数のパラメータ

1.2 qsort 関数を使用して整数データを並べ替える

1.3 qsort 関数を使用して構造データをソートする

2. qsort関数の実装をシミュレートする

2.1 バブルソート

2.2 コードの実装


         今日私が主に紹介するのは、qsort 関数の詳細な説明と、qsort 関数の実装をシミュレートするためのバブル ソートの使用です。ここでは、qsort 関数のパラメーターの理解と、昇順および降順ソートの使用が含まれます。 qsort 関数のパラメータをシミュレートするための配列構造の。

1.qsort関数

1.1 qsort関数のパラメータ

        qsort 関数については、初めて見る方も多いと思いますが、まずcplusplus というWeb サイトに入りましょう。

 古いバージョンに戻って、qsort 関数を探します。

 qsort 関数のヘッダー ファイルが stdlib.h であることがわかり、qsort 関数が次のように定義されていることがわかります。

void qsort (void* ベース、size_t 数値、size_t サイズ、
            int (*比較)(const void*,const void*));

 

        ここで、base は渡したい配列を指します。num は配列で渡される要素の数を指します。size は配列の 1 つの要素が占めるバイト数を指します。int (*compar)(const void*, const ) void* ) は関数ポインターです。ここで関数を作成する必要があります。

         qsort 関数は任意の型のデータを並べ替えることができ、キャストによって使用できるため、この関数ポインターのパラメーターは void* 型です。

1.2 qsort 関数を使用して整数データを並べ替える

#include<stdio.h>
#include <stdlib.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[5] = { 0,2,1,4,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

走った後に入手できます

昇順の場合、降順に変更したい場合は、comper 関数を変更するだけで済みます。

int comper(const void* e1, const void* e2)
{
	return  *(int*)e2- *(int*)e1 ;
}

実行後に降順に並べ替えます。

1.3 qsort 関数を使用して構造データをソートする

#include<stdio.h>
#include <stdlib.h>
typedef struct student
{
	int age;
	char num[20];
}stu;
int comper(const void* e1, const void* e2)
{
	return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{
	stu arr[3] = { 20,"zhangsan",19,"libai",22,"aiqiyi" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i].age );
	}
	return 0;
}

名前を比較する場合は strcmp 関数を使用する必要があります。具体的なコードは次のとおりです。

int comper(const void* e1, const void* e2)
{
	return strcmp(((stu*)e1)->num , ((stu*)e2)->num);
}

2. qsort関数の実装をシミュレートする

        バブル ソートを使用してデータを並べ替えることができると前述しましたが、バブル ソートにはいくつかの制限があります。ここでは、バブル ソートを使用して qsort 関数の実装をシミュレートします。

2.1 バブルソート

  バブルソートのメインコードは次のとおりです。

void bulubulu(int arr[],int sz)
{
	int i, j,temp;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

ここでは主にバブルソートを使用して実装します。

2.2 コードの実装

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void swap(char *p,char*q,size_t sz)
{
	int i;
	char temp;
	for (i = 0; i < sz; i++)
	{
		temp = *p;
		*p = *q;
		*q = temp;
		p++;
		q++;
	}
}
void bulubulu(void *base,size_t sz,size_t size)
{
	int i, j;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)
			{
				swap((char*)base+j*size,(char*)base+(j+1)*size,sz);
			}
		}
	}
}

void my_qsort(void *base,size_t num,size_t size,int(*comper)(const void *e1,const void *e2))
{
	bulubulu(base, num, size);
}
int main()
{
	int arr[5] = { 0,2,1,5,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);

}

        ここでは、整数配列をソートしたいと考えています。まず、配列の要素数と各要素が占めるバイト数を取得します。ソートする要素がわからないため、my_qsort 関数で void*base を使用します。バブル ソート関数 (bulubulu 関数) を入力します。ここで最も重要なことは、if (comper((char*)base + j * size, (char*)base + (j + 1) * size) であることです。 > 0) および swap((char*)base+j*size,(char*)base+(j+1)*size,sz)、ソートしたい型がわからないため、base は void* Type , swap 関数と comper 関数を使用したい場合は、アドレスを転送する必要があります。ベースを char* 型にキャストします。要素が占有するバイト数、サイズも取得し、そのアドレスを取得します。 swap では、バイトごとに交換します。ここで comper はユーザー自身によって書かれており、残りは my_qsort だけで解決できます。

今日の内容は以上です。多くのことを学んでいただければ幸いです。

おすすめ

転載: blog.csdn.net/Infernal_Puppet/article/details/132919664