【C语言】qsort函数
生活随笔
收集整理的這篇文章主要介紹了
【C语言】qsort函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、qsort函數原型
- 二、
- 1.qsort函數實現整型排序
- 2.qsort函數實現結構體排序
- 三. 冒泡排序算法模擬實現qsort函數
前言
qsort函數是八大排序算法中的快速排序,能夠排序任意數據類型的數組,包括實現整型,浮點型,結構體,字符串等的排序。qsort函數主要通過利用回調函數實現。
回調函數就是一個通過函數指針調用的函數,如果你把函數指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用,用于對該事件或條件進行響應。
一、qsort函數原型
頭文件:#include<stdio.h>
void qsort(void* base,//要排序的數據的首元素地址int num,//要排序的數據個數int width,//元素的字節大小void(*cmp)(const void* e1, const void* e2));//函數指針-接收比較函數,比較函數需要我們自己實現關于為什么要使用void*指針:首先要明確void**是無具體類型的指針,可以接受任意類型的地址,而qsort函數可以排序多種類型的數據,所以我們利用空指針接受地址。需要注意的是空指針沒有確定的步長大小,所以空指針不能加減整數,不能對空指針進行解引用。
二、
1.qsort函數實現整型排序
(1)升序
#include<stdio.h> #include<stdlib.h> //整型的比較函數 int cmp_int(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2; } int main() {int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//qsort庫函數的使用qsort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0; }(2)降序
#include<stdio.h> #include<stdlib.h> int cmp_int(const void* e1, const void* e2) {return *(int*)e2 - *(int*)e1;//后一個元素比前一個元素大,就交換 } int main() {int arr[] = { 0,1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0; }2.qsort函數實現結構體排序
(1)按年齡排序
#include<stdio.h> #include<stdlib.h> //定義結構體類型 struct Stu {//結構體成員int age;char name[20]; }; int cmp_stu_by_age(const void* e1, const void* e2) { //需要e1需要括號括起,才能訪問到結構體數據return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; } int main() {struct Stu s[] = { {30,"lisi"},{20,"wangwu"},{10,"zhangsan"} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);int i = 0;for (i = 0; i < sz; i++){printf("%d %s\n", s[i].age, s[i].name);}return 0; }(2)按名字排序
#include<stdio.h> #include<stdlib.h> struct Stu {int age;char name[20]; }; int cmp_stu_by_name(const void* e1, const void* e2) {//字符串的比較用strcmpreturn strcmp( ((struct Stu*)e1)->name, ((struct Stu*)e2)->name ); } int main() {struct Stu s[] = { {30,"lisi"},{20,"wangwu"},{10,"zhangsan"} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);int i = 0;for (i = 0; i < sz; i++){printf("%d %s\n", s[i].age, s[i].name);}return 0; }三. 冒泡排序算法模擬實現qsort函數
(1)排序整數
#include<stdio.h> //比較函數 int cmp_int(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2; } //以字節單位交換 void Swap(char* buf1, char* buf2, int width)//以字節為單位交換 {int i = 0;for (i = 0; i < width; i++){char temp = *buf1;*buf1 = *buf2;*buf2 = temp;buf1++;buf2++;} } void bubble_sort(char* base, int sz, int width, int(*cmp)(int, int)) {int i = 0;int j = 0;int flag = 0;for (i = 0; i < sz - 1; i++){flag = 1;for (j = 0; j < sz - 1 - i; j++){//強制類型轉換成char*類型if (cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0){Swap((char*)base + j * width, (char*)base + (j + 1)*width, width);flag = 0;}}if (flag == 1){break;}} } int main() {int arr[] = { 1,3,5,7,9,2,4,6,8,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0; }(2)排序浮點數
#include<stdio.h> float cmp_float(const void* e1, const void* e2) {return *(float*)e1 - *(float*)e2; } void Swap(char* buf1, char* buf2, int width)//以字節為單位交換 {int i = 0;for (i = 0; i < width; i++){char temp = *buf1;*buf1 = *buf2;*buf2 = temp;buf1++;buf2++;} } void bubble_sort(void* base, int sz, int width, int(*cmp)(void*, void*)) {int i = 0;int j = 0;int flag = 0;for (i = 0; i < sz - 1; i++){flag = 1;for (j = 0; j < sz - 1 - i; j++){if (cmp_float((char*)base+j*width,(char*)base+(j+1)*width)>0){Swap((char*)base + j * width, (char*)base + (j + 1)*width, width);flag = 0;}}if (flag == 1){break;}} } int main() {float arr[] = { 9.0,8.0,7.0,6.0,5.0,4.0,3.0,1.1,1.0 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;bubble_sort(arr, sz, sizeof(arr[0]), cmp_float);for (i = 0; i < sz; i++){printf("%.1f ", arr[i]);}return 0; }總結
以上是生活随笔為你收集整理的【C语言】qsort函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python解压rar 文件
- 下一篇: python检测屏幕亮点_使用Pytho