qsort函数在冒泡排序中的应用
冒泡排序
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int temp;//用于交换中间变量
for (int i = 0;i < sz - 1;i++)
{
for (int j = 0;j < sz - i - 1;j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void Print(int arr[], int sz)
{
for (int i = 0;i < sz;i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 0,6,7,8,9,1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);//升序
Print(arr, sz);//打印
return 0;
}
qsot函数的用法
在MSDN中qsot函数是这样定义的,
void qsort( void *base, size_t num, size_t width,
int (__cdecl *compare)(const void *elem1, const void *elem2));
对于qsot函数,它可以实现不同类型的排序,第一个参数类型是void*,无具体类型的指针,保证传进去的参数无论是什么类型,qsot函数都可以接收,但是因为是无类型,所以不能进行加减运算,也不能进行解引用。
qsot函数各个参数的意义:
qsot函数第一个函数参数void *base:待排序数组的头指针
qsot函数第二个函数参数size_t num:待排序数组的元素个数
qsot函数第三个函数参数size_t num:元素的大小,单位是字节
qsot函数第四个函数参数int (__cdecl *compare)(const void *elem1, const void *elem2):元素排序的方法,即排序时用来比较两个元素的函数,类型是函数指针(例如结构体数组,字符串数组的比较)。
qsot函数使用需要引用的头文件是<stdlib.h>
冒泡排序中的qsort
#include <stdio.h>
#include <stdlib.h>
int com(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;//强制类型转换后解引用
}
void Print(int arr[], int sz)
{
for (int i = 0;i < sz;i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 0,6,7,8,9,1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),com);
Print(arr, sz);//打印
return 0;
}
在这里,确定比较关系的函数com具有特定的要求,当e1小于e2时,返回小于0的数,当e1等于e2时,返回0,当e1大于e2时,返回大于0的数;此时只需要返回e1-e2即可,e1和e2都是无类型的参数指针,需要强制类型转换成int*,然后在解引用,这样得到的结果是一个升序排列的数组0 1 2 3 4 5 6 7 8 9。
如果我们想改变排序方式为降序,只需要调换e1-e2为e2-e1,如此便是一个降序的数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
char name[20];
int age;
};
int com(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
//return (struct stu*)e1)->age -((struct stu*)e2)->age;通过年龄排列
}
void Print(struct stu* s, int sz)
{
for (int i = 0;i < sz;i++)
{
printf("%s %d",s[i].name, s[i].age);
printf("\n");
}
}
int main()//给结构体数组赋值
{
struct stu s[3] = { {"张三",20},{"李四",33},{"王五",28} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), com);
Print(s, sz);
return 0;
}
这里时对结构体数组进行排列,分别通过名字顺序和年龄大小排列。