C语言-qsort函数排列数据以及模拟实现

目录

1.库函数qsort

2.使用qsort排列各种类型数据

3.通过冒泡排序模拟实现qsort


1.库函数qsort

#include<stdlib.h>

int main()
{
    void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void 
   *elem1, const void *elem2 ) );

     return 0;
}

定义:执行快速排序

头文件:<stdlib.h>

注释:qsort函数实现了一个快速排序算法,对一个包含num个元素的数组进行排序,每个元素的宽度/字节。实参base是指向要排序的数组起始位置的指针。Qsort用已排序的元素覆盖此数组。参数compare是指向用户提供的例程的指针,用于比较两个数组元素并返回指定它们之间关系的值。Qsort在排序过程中调用一次或多次比较例程,每次调用传递指向两个数组元素的指针:

 注:这里之所以要自定义比较的函数,是因为使用者在进行数据比较的时候,比较的类型包括但不限于整型,浮点型,甚至是结构体类型的数据,使用者可以根据自己的需要,设计出具体比较不同类型的函数。

2.使用qsort排列各种类型数据

      2.1 qsort排序整数类型

#include<stdlib.h>

void print(int arr[], int sz)//打印数组
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int __cdelc(const void* e1, const void* e2)//自定义比较函数
{
	if (*(int*)e1 , *(int*)e2)
	{
		return  (*(int*)e1 - *(int*)e2);
	}
}


void test1() //qsort函数排序整型数组
{
	int arr[] = { 1,3,5,7,9,2,4,6,8,10 };

	int sz = sizeof(arr) / sizeof(arr[0]);


	qsort(arr, sz, sizeof(arr[0]), __cdelc);

	print(arr, sz);
}


int main()
{
	test1();

	return 0;
}

   

  2.2 qsort排序结构体类型

#include<stdio.h>
#include<stdlib.h>

struct stu//定义结构体类型
{
	char name[10];
	int age;
	double score;
};

void print2(struct stu arr[], int sz)//打印
{
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			printf("%s, %d, %lf\n", arr[i].name, arr[i].age, arr[i].score);
		}
}

int __cdelc2_by_age(const void* e1, const void* e2)//通过年龄比较
{
	return (((struct stu*)e1)->age - ((struct stu*)e2)->age);
}

int __cdelc2_by_name(const void* e1, const void* e2)//通过名字比较
{
	return strcpy( ((struct stu*)e1)->name, ((struct stu*)e2)->name );
}

test2()
{
	struct  stu arr[] = {
   
   {"小明",15,65.5},{"小强",19,80.5},{"小美",17,70.0}};
	int sz = sizeof(arr) / sizeof(arr[0]);

	qsort(arr, sz, sizeof(arr[0]), __cdelc2_by_age);
	//qsort(arr, sz, sizeof(arr[0]), __cdelc2_by_name);

	print2(arr, sz);
}

int main()
{
	test2();

	return 0;
}

3.通过冒泡排序模拟实现qsort

 代码如下:

#include<stdio.h>
void print3(int arr[], int sz)//打印
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}


void swap(char* buf1, char* buf2, int width) //交换函数
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char* tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void  bubble_qsort(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < num - 1; i++)
	{
		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);//交换
			}
		}   
	}
}


int __cdelc3(const void* e1, const void* e2)//比较函数
{
	return (*(int*)e1 - *(int*)e2);
}


void test3()
{
	int arr[] = { 1,3,5,7,9,2,4,6,8,10 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_qsort(arr, sz, sizeof(arr[0]), __cdelc3);

	print3(arr, sz);
}


int main()
{
	test3();

	return 0;
}

思路:

 比较元素的思路:

交换元素的思路:


以上仅供参考,欢迎指正

猜你喜欢

转载自blog.csdn.net/m0_73969113/article/details/130829929