日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】qsort函数

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。