指针详解(二)

        1:基本冒泡排序

        在这里基本冒泡排序我就不多说了我们来看看我们新学的函数qsort

#include<stdio.h>
void bubble(int arr[], int sz)
{	
	int i = 0;
	for (i = 0;i < sz - 1;i++) 
	{
		int j;
		int flag = 1;
		for (j = 0;j < sz - 1 - i;j++) 
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = 0;
			}
			
		}
		if (flag == 1)
			break;
	}
}
int main()
{
	int arr[] = { 2,5,7,8,11,10,1,3,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz);
	for (int i = 0;i < sz;i++) {
		printf("%d ",arr[i]);
	}
	return 0;
}

        1.1:qsort函数

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

                    size_t num// 你要排序的元素个数

                    size_t width//你要排序的元素大小单位是字节

           int (*cmp)(const void* e1,void * e2)//函数指针比较函数自己写

那么我们来改进一下上面的冒泡排序

        

int bubble1(const void* e1, const void* e2) 
{
	return (*(int*)e1 - *(int*)e2);
}
int main()
{	
	int arr[] = { 2,5,7,8,11,10,1,3,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), bubble1);
	for (int i = 0;i < sz;i++) {
		printf("%d ",arr[i]);
	}
	return 0;
}

        其中我们先来讨论一下这个void*是无具体类型的指针,可以接受任意类型的地址,他是无具体类型的指针,所以不能解引用操作也不能进行指针运算,我们在使用的时候对他进行强制类型转换就OK啦,(就相当于java里面的泛型)

        我们来看这段函数int bubble1(const void* e1, const void* e2) 
        {
                    return (*(int*)e1 - *(int*)e2);
        }

首先这里的返回值只有三种一种是大于小于或等于0他会根据里面来排成升序或者降序

我们使用e1 e2 的时候我们需要把它强制转换成指针类型的数据然后对他解引用操作我们就可以返回啦

        qsort函数实现结构体的排序

struct stu {
	char name[20];
	int age;
};
int bubble2(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{	
	struct stu s[] = { {"zhangsan",15},{"lisi",20},{"wangwu",5} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), bubble2);
	for (int i = 0;i < sz;i++) 
	{
		printf("Name: %s, Age: %d\n", s[i].name, s[i].age);
	}
	return 0;
}

        我们在实现代码的时候要记得把结构体定义在前面不然编译的时候会找不到但是我们在写的时候却不会报错,我们这段代码根据结构体的字符来进行排序我们知道比较字符的时候不能直接比较我们必须使用strcmp函数来进行比较记得要应用头文件,同样我们把e1 e2  转换为结构体指针类型最后再进行遍历一下就OK

        

int bubble2(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int main()
{	
	struct stu s[] = { {"zhangsan",15},{"lisi",20},{"wangwu",5} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), bubble2);
	for (int i = 0;i < sz;i++) 
	{
		printf("Name: %s, Age: %d\n", s[i].name, s[i].age);
	}
	return 0;
}

对年龄进行排序

模拟一个自己的qsort

        首先分析一下qsort函数的参数我们以后在使用qsort函数的时候我们的参数类型是不确定的那么我们可以使用void*来接受我们的参数首地址,然后我们的num不用多说就是我们元素个数,然后就是我们的元素宽度在我们遍历的时候我们可以选择跳过多少字节

        

       void qsort(void* base

                    size_t num

                    size_t width

           int (*cmp)(const void* e1,void * e2)

        那么我们用冒泡排序的思路来首先我们的汤数不用变

void swap(char* b1, char* b2, int weight)
{
	for (int i = 0;i < weight;i++) 
	{
		char temp = *b1;
		*b1 = *b2;
		*b2 = temp;
		*b1++;
		* b2++;
	}

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

void my_qsort(void* base, int sz, int weight, int (*cmp)(const void* e1, const void* e2)) 
{
	
	int i = 0;
	for (i = 0;i < sz - 1;i++)
	{
		int j;
		int flag = 1;
		for (j = 0;j < sz - 1 - i;j++)
		{
			if (cmp((char*)base + j * weight, (char*)base + (j + 1) * weight) > 0)
			{
				swap((char*)base + j * weight, (char*)base + (j + 1) * weight, weight);
				flag = 0;
			}
			
		}
		if (flag == 1)
			break;
	}
}
int main()
{	
	int arr[] = { 2,5,7,8,11,10,1,3,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), bubble1);
	for (int i = 0;i < sz;i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值