目录
1.普通整形冒泡排序解析和模拟实现
1.1冒泡排序思想图解
1.2冒泡排序代码实现
#include<stdio.h>
void bubble(int* arr, int num)
{
int flag = 0;
for (int i = 0; i < num - 1; i++)//排10个数需要9趟,排n个数就是n-1趟
{
//一趟内部比较
flag = 0;
for (int j = 0; j < num - 1 - i; j++)
//每次循环一次,最末尾的i+1个数已经排好了,这里-1是为了防止越界比较
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
if (flag == 0) //如果一趟内部都没有一次交换行为,代表已经有序
break;
}
}
}
int main()
{
int arr[11] = { 3,1,5,7,8,6,2,4,9,0,11 };
bubble(arr, sizeof(arr) / sizeof(arr[0]));
for (int i = 0; i < 11; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.全类型冒泡排序解析和模拟实现
2.1全数据类型冒图解
2.2全数据类型冒泡排序代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu {
char name[20];
int age;
}stu;
int asc_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void Swap(char* p1,char* p2,int size)
{
//assert(p1 && p2);
while (size--)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
//ptr 指向需要排序的对象或数组
//num 对象或者数组的元素总数
//size 一个元素大小
//cmp 比较方法
void bublle_qsort(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*))
{
int flag = 0;
for (int i = 0; i < num -1; i++)//排10个数需要9趟,排n个数就是n-1趟
{
for (int j = 0; j < num - 1 - i; j++)//每次循环一次,最末尾的i+1个数已经排好了,这里-1也是为了防止越界比较
{
//假设需要升序cmp返回 >0 交换。
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//2个元素比较,需要传两个相邻元素的地址。
{
//交换
Swap((char*)base + (j * size), (char*)base + ((j + 1) * size), size);
}
}
}
}
int stuby_name(const void* p1, const void* p2)
{
return strcmp(((stu*)p1)->name, ((stu*)p2)->name);
}
int stuby_age(const void* p1, const void* p2)
{
return ((stu*)p1)->age - ((stu*)p2)->age;
}
int main()
{
stu starr[3] = { {"张三",35},{"王五",29},{"李四",18} };
int arr[11] = { 3,1,5,7,8,6,2,4,9,0,11 };
bublle_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), asc_int);
for (int i = 0; i < 11; i++)
{
printf("%d ", arr[i]);
}
bublle_qsort(starr, sizeof(starr) / sizeof(starr[0]), sizeof(starr[0]), stuby_name);
return 0;
}