C语言笔记12 •模拟qsort函数•

1.使用qsort函数进行排序

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


//void qsort(void* base, //指向待排序数组的第一个元素的指针
//           size_t num, //base指向数组中的元素个数
//           size_t size,//base指向的数组中一个元素的大小,单位是字节
//           int (*cmp)(const void*, const void*) //函数指针 - 传递函数的地址







int compare_int(const void* p1, const void* p2)
{
	return *(int*)p2 - *(int*)p1;//降序排列
	//return *(int*)p1 - *(int*)p2;//升序排列
}
void print(int arr[], int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%d", arr[i]);
	}
}
void test1()
{
	int arr[] = { 9, 7 ,8 ,6, 4 ,3 ,5 ,2 ,1 ,0 };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, num, size, compare_int);
	print(arr, num);
}


struct stu
{
	char name[20];
	int age;
};
int compare_name(const void* p1, const void* p2)
{
	
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//升序排列
	//return strcmp(((struct stu*)p2)->name, ((struct stu*)p1)->name);//降序排列
	
}
int compare_age(const void* p1, const void* p2)
{

	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;//升序排列
	//return ((struct stu*)p2)->age - ((struct stu*)p1)->age;//降序排列

}
void test2()
{
	struct stu arr[] = { {"zhangsan",20} , {"lisi",18} , {"wangwu",25} };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, num, size, compare_name);
	for (int i = 0; i < num; i++)
	{
		printf("%s ", arr[i].name);
	}
}
void test3()
{
	struct stu arr[] = { {"zhangsan",20} , {"lisi",18} , {"wangwu",25} };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, num, size, compare_age);
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i].age);
	}
}


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

	return 0;
}

2.模仿qsort的功能实现一个通用的冒泡排序

(1).普通冒泡排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int count = 0;
void bubble(int *arr[], int sz)
{
	int i = 0;
	int flag = 1;// 假设已经排好序了
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j+1] = temp;
			}
			count++;

		}
		if (flag == 1)
		{
			break;
		}
	}
	return;
}
int main()
{
	
	int arr[10] = {0};
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}
	bubble(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\ncount=%d", count);


	return 0;
}

这个冒泡排序只能对整形数组里的数值进行排序,而对字符数组,结构体里的值无法排序。

(2).通用冒泡排序

void swap(char *a, char* b,size_t size)
{
	for (int i = 0; i < size; i++)
	{
		char temp = *a;
		*a = *b;
		*b = temp;
		a++;
		b++;
	}
}
int compare_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

struct stu
{
	char name[20];
	int age;
};
int compare_name(const void* p1, const void* p2)
{
	
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//升序排列
	//return strcmp(((struct stu*)p2)->name, ((struct stu*)p1)->name);//降序排列
	
}
int compare_age(const void* p1, const void* p2)
{

	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;//升序排列
	//return ((struct stu*)p2)->age - ((struct stu*)p1)->age;//降序排列

}

void bubble_sort(void* base, size_t num, size_t size, int(*compare)(const void* ,const void* ))
{
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - 1 - i; j++)
		{
			if (compare((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}
void print(int arr[], int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
}

void test1()
{
	int arr[] = { 9, 7 ,8 ,6, 4 ,3 ,5 ,2 ,1 ,0 };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	bubble_sort(arr, num, size, compare_int);
	print(arr, num);
}

void test2()
{
	struct stu arr[] = { {"zhangsan",20} , {"lisi",18} , {"wangwu",25} };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, num, size, compare_name);
	for (int i = 0; i < num; i++)
	{
		printf("%s ", arr[i].name);
	}
}

void test3()
{
	struct stu arr[] = { {"zhangsan",20} , {"lisi",18} , {"wangwu",25} };
	int num = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, num, size, compare_age);
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i].age);
	}
}

int main()
{
	//test1();
	//test2();
	test3();
	return 0;
}

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛应用于软件开发的编程语言,具有简洁、高效、灵活等特点。为了更好地学习和掌握C语言,整理一份完整的笔记是非常有必要的。 首先,C语言的基础知识是理解和掌握该语言的关键。笔记中应包含C语言的基本语法,如变量的声明和定义、数据类型、运算符、控制语句等,这些是编写C程序的基础。 其次,C语言函数也是非常重要的一部分。函数C语言中的一种模块化的编程方式,可以提高代码的重用性和可维护性。在笔记中应包含函数的定义和调用、参数传递、函数返回值等内容,以及常用的C库函数的使用。 此外,C语言的数组和指针也是需要重点关注的内容。数组是一种存储多个相同类型数据的方式,而指针则是C语言中与内存地址相关的操作。在笔记中应包含数组的定义和初始化、多维数组的使用、指针的声明和运算等内容。 还有,C语言中的内存管理是需要特别注意的。动态内存分配是C语言的一个重要特性,可以根据需要在运行时分配和释放内存。笔记中应包括动态内存分配的函数,如malloc、free等,以及内存泄漏和内存溢出的问题的解决方法。 最后,C语言的文件操作也是需要掌握的一部分。文件操作是C语言中与磁盘文件进行读写的关键部分,可以实现数据的长久保存和共享。在笔记中应涵盖文件的打开和关闭、读取和写入、文件指针的操作等内容。 综上所述,C语言笔记的完整版应该包含C语言的基础知识、函数、数组和指针、内存管理以及文件操作等内容。通过阅读和整理笔记,可以更好地理解和应用C语言,提高程序编写的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值