/*傳統的冒泡排序法*/
#include
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("/n");
}
void bubble_sort(int arr[], int sz)
{
//冒泡排序的次數
for (int i = 0; i < sz - 1; i++)
{
//每一次冒泡排序交換的元素對數
for (int j = 0; j < sz - 1 - i; j++)
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}傳統的冒泡排序法結果:
/*使用快速訪問法*/
int cmp(const void* e1, const void* e2)//創建一個函數,且函數的參數類型與上面的
// 接收的函數指針一致
{
return *(int*)e1 - *(int*)e2;//傳過來的數組元素類型不確定,無法相加,所以強制轉換為Int型
}
void test1()
{
int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
qsort(arr, sz, sizeof(arr[0]), cmp);//按照qsort要求傳過去相應的參數
print(arr, sz);
}
struct stu{
char name[20];
int age;
};使用快速訪問法結果:
/*通過age排序*/
int sort_by_age(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
void test2()
{
struct stu s[3] = { { "zhangsan", 30 }, { "lisi", 20 }, { "wangwu", 40 } };
int sz = sizeof(s) / sizeof(s[0]);
// qsort(s, sz, sizeof(s[0]), sort_by_age);
qsort(s, sz, sizeof(s[0]), sort_by_age);
}結果:
測試通過結構體數組的name排序
#include
int sort_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
void test3()
{
struct stu s[3] = { { "zhangsan", 30 }, { "lisi", 20 }, { "wangwu", 40 } };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), sort_by_name);
int main()
{
//test1();//測試整形數組的排序
//test2();//測試通過結構體數組的age排序
test3();//測試通過結構體數組的name排序
}
}測試通過結構體數組的name排序結果:
總結:void qsort(void* base, //無類型指針接收傳過來的函數地址
int num, //傳過來的數組元素個數
int size, //每個元素的大小
int*(*cmp)(const void*, const void*))//函數指針