利用qsort排序

一、简单排序10个元素的一维数组

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int com_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	qsort(arr, 10, 4, com_int);
	print_arr(arr, 10);
 }

如果你想降序的话,那为社么不用这个呐

int com_int(const void* e1, const void* e2)
{
    return *(int*)e2 - *(int*)e1;
}

换个顺序后,代码便实现了由小到大,qsort是不是很神奇呐

二、结构体利用qsort排序 

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Stu
{
	char name[20];
	int age;
};
void print_arr(struct Stu arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i].name,arr[i].age);
	}
	printf("\n");
}
int sort_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

int sort_by_name(const void*e1, const void*e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

void test2()
{
	//使用qsort函数排序结构体数据
	struct Stu s[3] = { {"zhangsan", 30},{"lisi", 34},{"wangwu", 20} };

	int sz = sizeof(s) / sizeof(s[0]);
	//按照年龄来排序
	qsort(s, sz, sizeof(s[0]), sort_by_age);
	print_arr(s, 3);
	//按照名字来排序
	qsort(s, sz, sizeof(s[0]), sort_by_name);
	print_arr(s, 3);
}
int main()
{
	test2();
}

 注意点:

1、需要强制转化为struct Stu*类型

2、打印时,传递进去的参数需要是struct Stu类型

3、字符串比较,需要用strcmp表示

4、因为转化成了*类型,所以要将员数指定就用->

5、而在打印函数中仍旧为struct Stu类型,就继续使用.age和.name表示。

三、利用qsort进行排序,其中具体如何做到,再分析一波

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
struct Stu
{
	char name[20];
	int age;
};
void print_arr(struct Stu arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i].name,arr[i].age);
		printf("\n");
	}

}
int sort_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char temp = *buf1;
		*buf1 = *buf2;
		*buf2 = temp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; 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 main()
{
	struct Stu s[3] = { {"zhangsan", 30},{"lisi", 34},{"wangwu", 20} };
	int sz = sizeof(s) / sizeof(s[0]);
	bubble_sort(s,sz, sizeof(s[0]), sort_by_age);
	print_arr(s, sz);
	return 0;
 }

 我得强调,我有写关于冒泡的qsort的分析,得去冒泡的博客看一下了https://blog.csdn.net/weixin_62130773/article/details/129971215?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-1-129971215-null-null.268^v1^koosearch&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4450

真的很难了,关于qsort,幸好有这个函数不然排序,相当困难呀!!

细细琢磨一下呀!