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 웹사이트에 들어가 보겠습니다.

 이전 버전으로 돌아가서 qsort 기능을 찾으십시오.

 qsort 함수의 헤더 파일은 stdlib.h이고 qsort 함수는 다음과 같이 정의되어 있음을 알 수 있습니다.

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

 

        여기서 base는 전달하려는 배열을 나타내고, num은 배열에 전달된 요소 수를 나타내며, size는 배열의 한 요소가 차지하는 바이트 수를 나타냅니다. int (*compar)(const void*, const void*)는 함수 포인터입니다. 여기서 함수를 만들어야 합니다.

         이 함수 포인터의 매개 변수는 void* 유형입니다. qsort 함수는 모든 유형의 데이터를 정렬할 수 있고 캐스팅하여 사용할 수 있기 때문입니다.

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를 사용합니다. 부루불루 함수인 버블 정렬 함수에 들어갑니다. 여기서 가장 중요한 것은 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* 유형입니다. , swap 함수와 comper 함수를 사용하려면 주소를 전송해야 합니다. 기본을 char* 유형으로 캐스팅합니다. 또한 요소가 차지하는 바이트 수, 크기를 얻은 다음 해당 주소를 가져옵니다. 어떤 요소인지에 따라 스왑에서는 바이트 단위로 교환합니다. 여기서 comper는 사용자가 직접 작성했으며 나머지는 이를 해결하기 위해 my_qsort만 필요합니다.

오늘 내용은 여기까지입니다. 많이 배워가셨으면 좋겠습니다.

추천

출처blog.csdn.net/Infernal_Puppet/article/details/132919664