/*傳統的冒泡排序法*/

#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;

}

}

}傳統的冒泡排序法結果:

函數指針數組的運用_#include

/*使用快速訪問法*/

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;

};使用快速訪問法結果:

函數指針數組的運用_冒泡排序法_02

/*通過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);

}結果:函數指針數組的運用_i++_03


測試通過結構體數組的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排序結果:

函數指針數組的運用_函數指針_04





總結:void qsort(void* base,   //無類型指針接收傳過來的函數地址

         int num,     //傳過來的數組元素個數

         int size,    //每個元素的大小

         int*(*cmp)(const void*, const void*))//函數指針