总结一下qsort()函数的使用与注意
生活随笔
收集整理的這篇文章主要介紹了
总结一下qsort()函数的使用与注意
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 一、簡介 ? 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程進行排序
?
參 數:1 待排序數組首地址 2 數組中待排序元素數量 3 各元素的占用空間大小 4 指向函數的指針,用于確定排序的順序 說 明:qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,其時間復雜度為n*log(n)。 ???? qsort要求提供的函數是需要自己定義的一個比較函數,比較函數使得qsort通用性更好。有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。
???? 如int cmp(const void *a, const void *b)中有兩個元素作為參數,返回一個int值,如果比較函數返回大于0,qsort就認為a > b,返回小于0qsort就認為a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比較函數返回本來應該是1的(即a > b),而卻返回-1(小于0的數),那么qsort認為a < b,就把b放在前面去,但實際上是a > b的,所以就造成了降序排序的差別了。
???? 簡單來說,比較函數的作用就是給qsort指明元素的大小事怎么比較的。 ? 二、使用舉例(MinGW5測試通過) ? 1、對一維數組排序: ??? ? 2、對字符串排序: ? #include <stdio.h> #include <stdlib.h>typedef char Element_type;Element_type list[] = "djfkwjefklwefagj"; int Comp(const void *p1,const void *p2) {//降序排序return strcmp((char *)p2,(char *)p1);//升序排序//return strcmp((char *)p1,(char *)p2); }int main(void) {puts("排序前:");puts(list);printf("\n");//考慮還有字符串結束符,這里元素個數別忘減1qsort(list, sizeof(list) / sizeof(Element_type) - 1, sizeof(Element_type), Comp);system("pause");puts("排序后:");puts(list);printf("\n");return 0; }
3、按結構體中某個關鍵字排序(對結構體一級排序): #include <stdio.h> #include <stdlib.h>struct Node {double data;int other; }s[100];int Comp(const void *p1,const void *p2) {return (*(Node *)p2)->data - (*(Node *)p1)->data; }int main(void) {puts("排序前:");//codeprintf("\n");qsort(s, 100, sizeof(s[0]), Comp);system("pause");puts("排序后:");//codeprintf("\n");return 0; } 4、按結構體中多個關鍵字排序(對結構體多級排序)[以二級為例]: struct Node {int x;int y; }s[100];//按照x從小到大排序,當x相等時按y從大到小排序 int Comp(const void *p1,const void *p2) {struct Node *c = (Node *)p1;struct Node *d = (Node *)p2;if(c->x != d->x) return c->x - d->x;else return d->y - c->y; } 5、對結構體中字符串進行排序: struct Node {int data;char str[100]; }s[100];//按照結構體中字符串 str 的字典序排序 int Comp(const void *p1,const void *p2) {return strcmp((*(Node *)p1)->str,(*(Node *)p2)->str); }
?
參 數:1 待排序數組首地址 2 數組中待排序元素數量 3 各元素的占用空間大小 4 指向函數的指針,用于確定排序的順序 說 明:qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,其時間復雜度為n*log(n)。 ???? qsort要求提供的函數是需要自己定義的一個比較函數,比較函數使得qsort通用性更好。有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。
???? 如int cmp(const void *a, const void *b)中有兩個元素作為參數,返回一個int值,如果比較函數返回大于0,qsort就認為a > b,返回小于0qsort就認為a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比較函數返回本來應該是1的(即a > b),而卻返回-1(小于0的數),那么qsort認為a < b,就把b放在前面去,但實際上是a > b的,所以就造成了降序排序的差別了。
???? 簡單來說,比較函數的作用就是給qsort指明元素的大小事怎么比較的。 ? 二、使用舉例(MinGW5測試通過) ? 1、對一維數組排序: ??? ? 2、對字符串排序: ? #include <stdio.h> #include <stdlib.h>typedef char Element_type;Element_type list[] = "djfkwjefklwefagj"; int Comp(const void *p1,const void *p2) {//降序排序return strcmp((char *)p2,(char *)p1);//升序排序//return strcmp((char *)p1,(char *)p2); }int main(void) {puts("排序前:");puts(list);printf("\n");//考慮還有字符串結束符,這里元素個數別忘減1qsort(list, sizeof(list) / sizeof(Element_type) - 1, sizeof(Element_type), Comp);system("pause");puts("排序后:");puts(list);printf("\n");return 0; }
3、按結構體中某個關鍵字排序(對結構體一級排序): #include <stdio.h> #include <stdlib.h>struct Node {double data;int other; }s[100];int Comp(const void *p1,const void *p2) {return (*(Node *)p2)->data - (*(Node *)p1)->data; }int main(void) {puts("排序前:");//codeprintf("\n");qsort(s, 100, sizeof(s[0]), Comp);system("pause");puts("排序后:");//codeprintf("\n");return 0; } 4、按結構體中多個關鍵字排序(對結構體多級排序)[以二級為例]: struct Node {int x;int y; }s[100];//按照x從小到大排序,當x相等時按y從大到小排序 int Comp(const void *p1,const void *p2) {struct Node *c = (Node *)p1;struct Node *d = (Node *)p2;if(c->x != d->x) return c->x - d->x;else return d->y - c->y; } 5、對結構體中字符串進行排序: struct Node {int data;char str[100]; }s[100];//按照結構體中字符串 str 的字典序排序 int Comp(const void *p1,const void *p2) {return strcmp((*(Node *)p1)->str,(*(Node *)p2)->str); }
轉載于:https://www.cnblogs.com/pang123hui/archive/2011/01/28/1947003.html
總結
以上是生活随笔為你收集整理的总结一下qsort()函数的使用与注意的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为何泰山被誉为五岳之首?
- 下一篇: 泛海精灵 Beta计划 (草案)