/*傳統(tǒng)的冒泡排序法*/
#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)
{
//冒泡排序的次數(shù)
for (int i = 0; i < sz - 1; i++)
{
//每一次冒泡排序交換的元素對(duì)數(shù)
for (int j = 0; j < sz - 1 - i; j++)
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}傳統(tǒng)的冒泡排序法結(jié)果:
/*使用快速訪問(wèn)法*/
int cmp(const void* e1, const void* e2)//創(chuàng)建一個(gè)函數(shù),且函數(shù)的參數(shù)類(lèi)型與上面的
// 接收的函數(shù)指針一致
{
return *(int*)e1 - *(int*)e2;//傳過(guò)來(lái)的數(shù)組元素類(lèi)型不確定,無(wú)法相加,所以強(qiáng)制轉(zhuǎn)換為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要求傳過(guò)去相應(yīng)的參數(shù)
print(arr, sz);
}
struct stu{
char name[20];
int age;
};使用快速訪問(wèn)法結(jié)果:
/*通過(guò)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);
}結(jié)果:
測(cè)試通過(guò)結(jié)構(gòu)體數(shù)組的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();//測(cè)試整形數(shù)組的排序
//test2();//測(cè)試通過(guò)結(jié)構(gòu)體數(shù)組的age排序
test3();//測(cè)試通過(guò)結(jié)構(gòu)體數(shù)組的name排序
}
}測(cè)試通過(guò)結(jié)構(gòu)體數(shù)組的name排序結(jié)果:
總結(jié):void qsort(void* base, //無(wú)類(lèi)型指針接收傳過(guò)來(lái)的函數(shù)地址
int num, //傳過(guò)來(lái)的數(shù)組元素個(gè)數(shù)
int size, //每個(gè)元素的大小
int*(*cmp)(const void*, const void*))//函數(shù)指針