/*傳統(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é)果:

函數(shù)指針數(shù)組的運(yùn)用_#include

/*使用快速訪問(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é)果:

函數(shù)指針數(shù)組的運(yùn)用_冒泡排序法_02

/*通過(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é)果:函數(shù)指針數(shù)組的運(yùn)用_i++_03


測(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é)果:

函數(shù)指針數(shù)組的運(yùn)用_函數(shù)指針_04





總結(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ù)指針