冒泡排序算法
冒泡排序的算法非常简单就是——两两相邻的元素进行比较
1.要清楚冒泡排序需要进行几趟排序
2.要了解冒泡排序每一趟需要进行排序几对
如果前面的数大于后面的数就要进行交换。
第一趟已经排序好了一个数字,因此第二趟是数字个数减1
int main()
{
int arr[] = {3,2,5,6,1,4};
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;=
printf("冒泡排序前:");
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
for (i = 0; i < sz - 1; i++)//趟数
{
int j = 0;
//每趟进行比较的对数
for (j = 0; j < sz - 1 - i; j++)
{
//进行比较 交换
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
printf("冒泡排序前:");
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
qsort函数是C语言标准库中的一个排序函数,用于对数组进行快速排序。它的原型定义在头文件stdlib.h中,函数签名如下:
void qsort(void base,
size_t nmemb,
size_t size,
int (compar)(const void , const void ));
//------------------------------------------------------------------------------
qsort函数有四个参数分别是:
/void qsort (void base, //待排序的数组
size_t num, //待排序数组的元素个数
size_t size,//待排序数组一个元素的大小
int (compar)(const void,const void));//比较函数/
1.qsort函数可以排序任意类型的数据,当然比较函数需要我们自己去编写。比较函数返回值说明
< 0 elem1小于elem2
==0 elem1等于elem2
.>0 elem1大于elem2
数组按照比较函数定义的递增顺序排序。要按降序对数组进行排序,请颠倒比较函数中“大于”和“小于”的含义。
int cmp_arr(const void* e1, const void* e2)
{
/*比较函数的两个形参必须是void*类型的*/
/* void* 可以接受任意类型的元素,但是进行相关的运算 */
return *(int*)e1 - *(int*)e2;
}
void print_arr(int arr[], int sz)/* 打印函数 */
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {4,1,2,6,3,5,7,9,8,0};
int sz = sizeof(arr) / sizeof(arr[0]);/* 求数组元素个数 */
printf("排序前:");
print_arr(arr, sz);
qsort(arr, sz, sizeof(arr[0]), cmp_arr);
printf("排序后:");
print_arr(arr, sz);
return 0;
}
我们需要用冒泡排序的思路来实现qsort函数的功能。
冒泡排序算法,就是两两相邻的两个数进行比较和交换。
需要注意的地方
1.其中的void是可以接受任意类型,但是不能进行运算。
2.char 可以访问一个字节的空间,加多少个字节跳过多少个字节的空间,例如
char*+4相当于跳过一个整型的大小
3.比较函数是需要强制转换类型的。
4.第二个for循环里面我们需要判断是比较函数的返回值
5.交换函数那里循环完就交换了一个类型的数据。
//***********************************************************************
int cmp_int(const void* e1, const void* e2)/* 比较函数 */
{
/* 因为两个形参的是viod*类型 所以需要强制类型转换 */
return *(int*)e1 - *(int*)e2;
}
void Swap(char* base1, char* base2, size_t width)/* 交换函数 */
{
/* 以字节个数交换 */
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *base1;
*base1 = *base2;
*base2 = tmp;
base1++;
base2++;
}
}
void Bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void*, const void*))
{
int i = 0;
int j = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
//进行比较
/* char* 指针可以访问一个字节的空间,因此所有的参数强制转换为char*类型 */
if(cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)/*这里判断的是比较函数返回值*/
{
Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}
void test()
{
int array[] = {1,3,6,5,4,2,0,7,9,8};
int sz = sizeof(array) / sizeof(array[0]);
Bubble_sort(array,sz,sizeof(array[0]),cmp_int);
print_arr(array, sz);
}
int main()
{
test();//用冒泡排序的思路来实现qsort函数
return 0;
}
写完这文章,我更加深刻理解了冒泡排序和qsort函数的算法。同时也给我带来小小的成就感。希望看完这篇文章帅哥美女,对你有所帮助。