【C语言】qsort函数以及模拟实现qsort


1.qsort函数

1.1介绍

【C语言】qsort函数以及模拟实现qsort_第1张图片
注意
快速排序适用于排序整形、字符、字符串和结构体等等,创作者并不知道使用这个函数的人用来排序什么,所以void类型来代替待排数组的起始地址的类型,用const void类型来代替待排序的两个元素的指针p1和p2的类型。并且void的指针可以接收任意类型的指针。但是void的指针不能直接解引用,其是无具体类型的。

1.2例子

  1. 排序一组整数(从左到右,从小到打排序)
#include
#include
int compar(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;//p1>p2就返回正数,p1放在右,p2放在左
}                                //p1=p2就返回0,p1=p2
int main()                       //p1

答案【C语言】qsort函数以及模拟实现qsort_第2张图片
2. 排序结构体(分别按年龄排序和按字符排序)

struct stu
{
	char name[20];
	int age;
};
int compare_by_age(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;//记得考虑操作符的优先级
}
int compare_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name ,((struct stu*)p2)->name );//strcmp返回值刚好可以对应compar_by_name的返回值
}
int main()
{
	struct stu s[3] = { "zhang",18,"li",22,"wang",20 };
	int num = sizeof(s) / sizeof(s[0]);
	int width = sizeof(s[0]);
	int i = 0;
	//按照年龄进行排序
	qsort(s, num, width, compare_by_age);
	for (i = 0; i < num; i++)
	{
		printf("%d ", s[i].age);
	}
	printf("\n");
	//按照姓名排序
	qsort(s, num, width, compare_by_name);
	for (i = 0; i < num; i++)
	{
		printf("%s ", s[i].name);
	}
	return 0;
}

答案
【C语言】qsort函数以及模拟实现qsort_第3张图片


2.模拟实现qsort

现阶段我学过的排序算法只有冒泡和简单排序,所以我打算在冒泡排序的基础上进行改进,使其能排序任意数组,达到模拟实现qsort的目的。

struct stu
{
	char name[20];
	int age;
};
int compar(const void* p1, const void* p2)//用来比较两个整形的
{
	return *(int*)p1 - *(int*)p2;
}
int compar_by_age(const void* p1, const void* p2)//用来比较结构体内的整形
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
int compar_by_name(const void* p1,const void* p2)//用来比较结构体内的字符串
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void swap(char*p1,char*p2,size_t width)//用来交换两元素的位置
{                                      //通过对字符指针的解引用,逐个字节进行交换
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}
void bubble_sort(void* base, size_t num,size_t width,int(*compar)(const void*,const void*))
{                                         //模拟实现qsort,void*base是因为不确定数组类型,我们可能排序
	int i = 0;                            //字符数组,整形数组或者结构体数组等等,所以接受时用void*。
	int j = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (compar((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{    //强制类型转换成char*,然后加上元素的大小,就可以跳到下一个元素
				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	}
}

你可能感兴趣的:(c语言,开发语言)