qsort函数的使用及其通过冒泡排序实现

目录

1.qsort函数的使用

1.1 qsort函数参数介绍

1.2qsort函数的使用

2.qsort函数通过冒泡排序实现


1.qsort函数的使用

1.1 qsort函数参数介绍

void qsort( void *base,//你要排序的数据的起始位置

size_t num,//待排序的数据元素的个数

size_t width, //待排序的数据元素的大小(单位是字节)

int (__cdecl *compare )(const void *elem1, const void *elem2 ) );//函数指针-比较函数

1.2qsort函数的使用

头文件的调用:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

qsort排序的各种类型:

//int类型的比较
int cmp1(const void* p1, const void* p2)
{

	return *(int*)p1 - *(int *)p2;
}


void test1()
{
	int arr1[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
	int i = 0;

	qsort(arr1, 10, sizeof(int), cmp1);

	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
}
//char类型的比较

int cmp2(const void* p1, const void* p2)
{
	return *(char*)p1 - *(char *)p2;
}

void test2()
{
	char arr2[5] = { 'N', 'E', 'A', 'V', 'B' };
	int i = 0;

	qsort(arr2, 5, sizeof(char), cmp2);

	for (i = 0; i < 5; i++)
	{
		printf("%c ", arr2[i]);
	}
	printf("\n");
}
//浮点类型的比较
int cmp3(const void* p1, const void* p2)
{

	return (int)(*(float*)p1 - *(float *)p2);
}

void test3()
{
	float arr3[] = { 1.0f, 0.9f, 2.1f, 3.1f, 5.1f };
	
	int i = 0;

	qsort(arr3, sizeof(arr3) / sizeof(arr3[1]), sizeof(float), cmp3);

	for (i = 0; i < 5; i++)
	{
		printf("%f ", arr3[i]);
	}
	printf("\n");
}
//结构体类型的比较
typedef struct student
{
	char name[20];
	int  age;
}stu;

int cmp4(const void* p1, const void* p2)
{
	return strcmp(((stu*)p1)->name, ((stu*)p2)->name);
}

int cmp5(const void* p1, const void* p2)
{
	return ((struct student*)p1)->age - ((struct student*)p2)->age;
}

void test4()
{
    stu arr4[3] = { "zhangsan", 14, "lisi", 12, "angwu", 11 };

	int i = 0;

	qsort(arr4, 3, sizeof(stu), cmp4);

	qsort(arr4, 3, sizeof(stu), cmp5);


	for (i = 0; i < 3; i++)
	{
		printf("%d ", arr4[i].age);
		printf("%s ", arr4[i].name);
	}
	printf("\n");

}

主函数:

int main()
{
	test1();
	test2();
	test3();
	test4();


	return 0;
}

2.qsort函数通过冒泡排序实现

void swap(char* buf1,char* buf2,int width)
{
	int i;

	for (i = 0; i < width; i++)
	{
		char temp = *buf1;
		*buf1 = *buf2;
		*buf2 = temp;
		buf1++;
		buf2++;
	}
}

void bubble_qsort(void *base, size_t num, size_t width, int(*cmp)(const void*p1, const void*p2))
{
	int i, j;
	for (i = 0; i< num; i++)
	{
		int flag = 1;
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0)
			{
				swap((char*)base + j*width, (char*)base + (j + 1)*width, width);
//这里表示前面一个元素与后面一个元素相差一个类型,width就是字节的大小 首地址+字节的大小=元素类型
//j*width是为了确定前后元素地址的变化	
		}
			flag = 0;
		}
		if (flag == 1)
		{
			break;
		}
	}
	
}

int cmp(const void*p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

int main()
{
	int arr[5] = { 8, 2, 0, 5, 7 };

	bubble_qsort(arr, 5, sizeof(arr[0]), cmp);

	int i;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

总结:1.qsort函数通过冒泡排序实现,首先应该知道用void的指针来接受任意类型的数组的首元素地址,然后将其转化为char类型的指针,由于char*的指针进行解引用一次访问一个字节,那么就能实现通过char*指针对数字一个字节一个字节的替换。例如冒泡就是每次交换的是4字节,我们的思想是将四字节变小成一字节来处理,就是将不同类型强制转换为char*指针来接受然后进行处理。

2.这里需要函数调用(因为不同人会用不同的类型,所以我们需要他自己确定好类型,让他自己写个比较函数),然后就是理解参数的运用。

-------如有不妥之处还请指正

猜你喜欢

转载自blog.csdn.net/includeevey/article/details/125146553
今日推荐