1.冒泡排序
冒泡排序是两两相邻的两个元素进行比较,我们可以利用冒泡排序来进行对整型数组进行升序或者降序的排序
这里进行升序演示
例如:
使用冒牌排序之后变成
这里2和3交换了位置,而冒泡排序使用一次只会将一位最大的数移动到最右边如:
这里进行升序排序会变成
可以看到这里只进行了一次冒泡排序,而我们需要的不止是一次,因为冒泡是两两相邻进行比较,所以需要进行0~n-1次 (n代表的是数组的长度)
下面看代码#include<stdio.h>
void print(int arr[], int len)
{
for (int i = 0; i < len-1; i++) 进行n-1次循环
{
for (int j = 0; j < len - i - 1; j++) //循环一次之后,要比较的数就会减少一次,所以-i
{
if (arr[j] > arr[j+1]) //改成< 就是降序
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 1,3,4,5,2,6,7,8,9 };
int len =sizeof(arr) / sizeof(arr[0]); //计算数组长度
print(arr, len);
for (int i = 0; i < len; i++) //遍历数组
{
printf("%d ", arr[i]);
}
return 0;
}
那要是要排序的数不要排序n-1次呢?我们可以进行改良
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 - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;//
//发⽣交换就说明,⽆序
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (flag == 1)//
//这⼀趟没交换就说明已经有序,后续⽆序排序了
break;
}
}
int main()
{
int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.qsort使用
首先看qsort的使用
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
void* base 表示的是数组的地址
size_t num 表示的是数组的元素
size_t size 表示的是数组的字节大小
int (*compar)(const void*,const void*) 是一个函数指针 返回的是int类型
const void*,const void* 表示要进行比较的两个数 相减 指向同一个空间的两个指针相减会变成一个整数,如果大于0表示e1大于e2交换位置,等于0表示相等, 小于0表示e1小于e2不交换位置
3.qsort函数模拟实现
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
qsort函数有这4个参数,分别是函数地址 ,数组元素,字节大小,和判断元素的大小
首先定义函数
_swap 完成数组元素的交换,因为qsort可以对任意类型数的交换,所以用char
bubble 4个参数 数组地址 元素总量 字节大小 函数指针比较大小
int_cmp 利用函数变量完成两个元素的判断,并返回一个整数
因为qsort函数可以进行任意类型元素进行交换,所以把数组类型强制转换为char*进行交换元素
j*size j表示第几个元素,size是数组元素字节大小
if(cmp((char*)base + j * size, (char*)base + (j + 1) * size)>0)
因为形参是void*类型,所以强制转换为数组元素类型int*
指针进行减法,返回一个整数,如果大于0表示 arr[ j ]> arr[ j+1 ]
进行元素交换,size表示数组元素字节大小
强制转换为char*可以方便进行别的类型元素运算