개인 홈페이지 : 클릭하시면 홈페이지로 들어가실 수 있습니다.
열 분류: C 언어 초급 C 언어 프로그래밍 ——KTV C 언어 미니 게임 C 언어 고급
누구나 좋아요, 댓글, 수집을 환영합니다.
같이 열심히 일하고, 같이 큰 공장에 가세요.
목차
오늘 제가 주로 소개하는 내용은 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만 필요합니다.
오늘 내용은 여기까지입니다. 많이 배워가셨으면 좋겠습니다.