C语言实现冒泡排序(包括任意类型性(即库函数qsort)和自己定义的(qsort方法)和仅整形能用)

  • Post author:
  • Post category:其他


冒泡排序

第一种仅为整形
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
	int i = 0;
	//确定冒泡排序的趟数
	for (i = 0; i < sz - 1; i++)
	{	
		int flag = 1;//假设已经有序
		int j = 0;
		//每一趟的排序
		for (j = 0; j < sz - 1 - i; j++)//sz-1-i 比较一个数字减一所以是个变着的数字
		{
			if (arr[j] > arr[j + 1])//让前一个元素和后一个元素比较交换
			{
				int tmp = arr[j];
				arr[j ] = arr[j+1];
				arr[j+1] = tmp;
				flag = 0;//该数组并不完全有序
			}
		}
		if (flag == 1)//如果有序直接跳出循环
		{
			break;
		}
	}
}
int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	for (int i = 0; i < sz; i++)//将排序好的打印出来
	{
		printf("%d  ",arr[i]);
	}
	return 0;
}
```c
第二种可以比较任意一种不仅仅是整形,
//qsortC语言库函数
//qsort(arr,sz,sizeof(arr[0]),cmp_int);
//第一个参数是待排序的地址
//第二个参数是待排序元素的个数
//第三个参数是带排序每个元素的大小--单位是字节
//第四个参数是函数指针,比较两个元素的地址
// 使用这个函数自己实现 int cmp_int(const void* e1,const void* e2);
//函数指针两个参数是待排序两个函数的地址
int cmp_int(const void* e1,const void* e2)
{
	//比较两个整型
	return *(int*)e1 - *(int*)e2;
}
void test1()
{
	int arr[10] = {9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,sz,sizeof(arr[0]),cmp_int);//qsortC语言库函数
	for (int i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
}

float cmp_float(const void* e1, const void* e2)
{
	//比较两个浮点型
	return  ((int)(*(float*)e1 - *(float*)e2));
}
void test2()
{
	float f[] = {9,8,7,6,5};
	int sz = sizeof(f) / sizeof(f[0]);
	qsort(f, sz, sizeof(f[0]), cmp_float);//qsortC语言库函数
	int j = 0;
	for (j = 0; j < sz; j++)
	{
		printf("%f ", f[j]);
	}
}


struct stu
{
	char name[20];
	int age;
};
int cmp_age(const void*e1, const void*e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
void test3()
{
	struct stu s[3] = { {"zhansan",20},{"lisi",30},{"wangwu",10}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s,sz,sizeof(s[0]),cmp_age);
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
}
void test4()
{
	struct stu s[3] = { {"zhansan",20},{"lisi",30},{"wangwu",10} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_name);
}
int main()
{
	test1();
	printf("\n");
	test2();
	test3();
	test4();
	return 0;
}
第三种为自己定义的qsort 
//qsortC语言库函数
//qsort(arr,sz,sizeof(arr[0]),cmp_int);
//第一个参数是待排序的地址
//第二个参数是待排序元素的个数
//第三个参数是带排序每个元素的大小--单位是字节
//第四个参数是函数指针,比较两个元素的地址
// 使用这个函数自己实现 int cmp_int(const void* e1,const void* e2);
//函数指针两个参数是待排序两个函数的地址
int cmp_int(const void* e1, const void* e2)
{
	//比较两个整型
	return *(int*)e1 - *(int*)e2;
}

void Swap(char* buf1,char* buf2, int width)//需要传入width参数为了确定传参的字节的大小
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(void* e1, void* e2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//每一趟
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			//每两个元素进行比较
			//把base前后两个元素强转为char* ,乘以字节大小,然后调用自己写的cmp,根据返回值来来排序
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width ,width);需要传入width参数为了确定传参的字节的大小
			}

		}

	}
}
void test1()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);//自己定义的qsortC语言库函数
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	test1();
	return 0;
}



版权声明:本文为m0_52041679原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。