1. 程式人生 > >stdlib庫中qsort函式的使用

stdlib庫中qsort函式的使用

qsort :功 能: 使用快速排序例程進行排序   

用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));   

各引數:1 待排序陣列首地址 2 陣列中待排序元素數量 3 各元素的佔用空間大小 4 指向函式的指標

用於確定排序的順序 排序方法有很多種, 選擇排序,氣泡排序,歸併排序,快速排序等。 快速排序比選擇排序,氣泡排序都要快。這是因為他速度很快,所以系統也在庫裡實現這個演算法,便於我們的使用。 這就是qsort。

qsort 要求提供一個 比較函式,是為了做到通用性更好一點

。比如你不僅僅的是要排序一個數字而已,可能你要用來排序幾個數字 ,比如有一個結構 struct  num {

           int a;

          int b; 

} ; 

然後我有一個num 型別的陣列, num dddd[100]; 我想給 dddd這個陣列排序,那怎麼辦? 我想讓 a +b 最大的num元素排在陣列的最前面,那又怎麼辦? 這都可以通過定義比較函式來做到的。 比較函式的作用就是給qsort指明 元素的大小是怎麼比較的。 

像這樣的比較函式 inline int MyCmp(const void* a, const void* b) 都是有兩個元素 作為引數,返回一個int 值, 如果 比較函式返回大於0,qsort就認為 a>b , 如果比較函式返回等於0 qsort就認為a 和b 這兩個元素相等,返回小於零 qsort就認為 ab),你比較函式卻返回一個 -1 (小於零的)那麼qsort認為a<本文中排序都是採用的從小到大排序>

一、對int型別陣列排序

int num[100];

Sample: 

int cmp ( const void *a , const void *b )

{ return *(int *)a - *(int *)b; }

qsort(num,100,sizeof(num[0]),cmp);

二、對char型別陣列排序(同int型別)

char word[100];

Sample: int cmp( const void *a , const void *b )

{ return *(char *)a - *(char *)b; }

qsort(word,100,sizeof(word[0]),cmp);

三、對double型別陣列排序(特別要注意)

double in[100];

int cmp( const void *a , const void *b )

{ return *(double *)a > *(double *)b ? 1 : -1; }

qsort(in,100,sizeof(in[0]),cmp);

四、對結構體一級排序

struct In { double data; int other; }s[100]

//按照data的值從小到大將結構體排序,關於結構體內的排序關鍵資料data的型別可以很多種,

//參考上面的例子寫

int cmp( const void *a ,const void *b)

{ return (*(In *)a).data > (*(In *)b).data ? 1 : -1; }

qsort(s,100,sizeof(s[0]),cmp);

五、對結構體二級排序

struct In { int x; int y; }s[100];

//按照x從小到大排序,當x相等時按照y從大到小排序

int cmp( const void *a , const void *b )

{

struct In *c = (In *)a; struct In *d = (In *)b;

if(c->x != d->x)

          return c->x - d->x;

else

          return d->y - c->y;

}

qsort(s,100,sizeof(s[0]),cmp);

六、對字串進行排序

struct In { int data; char str[100]; }s[100];

//按照結構體中字串str的字典順序排序

int cmp ( const void *a , const void *b )

{

return strcmp( (*(In *)a)->str , (*(In *)b)->str );

}

qsort(s,100,sizeof(s[0]),cmp);

七、計算幾何中求凸包的cmp

int cmp(const void *a,const void *b)

//重點cmp函式,把除了1點外的所有點,旋轉角度排序

{

struct point *c=(point *)a;

struct point *d=(point *)b;

if( calc(*c,*d,p[1]) < 0)

         return 1;

else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y))

//如果在一條直線上,則把遠的放在前面

        return 1;

else return -1;

}

相關推薦

stdlibqsort函式的使用

qsort :功 能: 使用快速排序例程進行排序    用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));    各引數:1 待排序陣列

C語言標準round函式

本文轉自---http://demon.tw/programming/c-round.html C語言標準庫中有沒有round函式?答案是,可能有,也可能沒有。這取決於你使用的編譯器,更準確地說,是編輯器是否支援C99標準。 讓我們簡單回顧一下C語言標準的歷史:C的第一個標

OpenCVwatershed函式(分水嶺演算法)的詳細使用例程

#include <iostream> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; Mat srcImage, srcImage_, maskImage; Mat maskWaterS

C++標準排序函式sort的用法

(一)為什麼要用c++標準庫裡的排序函式 Sort()函式是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間複雜度為n*log2(n),執行效率較高! (二)c++標準庫裡的排序函式的使用方法 I)S

VS2015及VS2017組合語言呼叫C語言的stdio函式

眾所周知,VS可以用來寫組合語言,同樣的在組合語言中,我們可以呼叫C語言中的函式,前提我們需要知道呼叫的函式在哪裡。例如下面這一段程式碼:;//VS15/17 Template for Win32 Console Application.686.MODEL flat, std

【轉】關於Python查詢函式方式

首先開啟命令列輸入: python -m pydoc -p 1234ython -m pydoc表示開啟pydoc模組,這個模組就是用來檢視python文件的工具-p 1234表示在埠號1234上開啟server,這個埠號可以自行設定原文地址:https://blog.csd

對標準stdlib.h二分查詢的理解

前幾天面試的時候遇到了這個問題 ,標準庫下提供的二分查詢改錯,當時沒有改出來,寫得不好,回來查了下,這個函式的原型是: /* bsearch() and qsort() are declared both here, in <stdlib.h>, and in * non-AN

Python擴充套件numpywhere()函式的三種用法 Python擴充套件numpywhere()函式的三種用法

原 Python擴充套件庫numpy中where()函式的三種用法 2018年06月25日 07:43:56 Python_小屋 閱讀數:1000

c++cmath函式(學生筆記)

c++中cmath是一個重要的數學函式庫。呼叫時必須包含cmath主檔案。 #include #include 其常用函式原型: int abs(int n) 求n的絕對值 double cos/sin/tan(double x) 求x的三角函式值(x為弧度值) double exp(dou

turtle的一些常用而有趣的函式

話不多說,開門見山。 turtle.circle(radius, extend, step) 1. 該函式是一個畫圓的函式 2. 第一個引數必須有,是半徑,以距畫筆的左邊radius長度為圓心,作一個半徑為radius的圓 3. 第二個引數可選,是角度(角度制)。例如當你想

C語言常用函式函式

1.pow(x,y);求x的y次方; 2.strstr(str1,str2);判斷str2是否為str1的子串,若是返回首次出現的位置,若不是返回NULL; 3.strcat(char* dest, const char *src);字串剪接函式,將src接

對於STM32F4函式GPIO_PinAFConfig()函式的解讀

  最近在學STM32F4晶片,想用暫存器操作,在學到IO埠複用AF(Alternative Function)時,發現對於 GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPI

編寫一個函式 reverse_string(char * string)(遞迴實現) 實現:將引數字串的字元反向排列。 要求:不能使用C函式的字串操作函式

給定字串,程式碼如下: #include <stdio.h> #include <stdlib.h> #include <assert.h> char* reverse_string(char *str) { assert(str !

C重要字串自動分割函式strtok

函式strtok  原型  char * strtok ( char * str, const char * delimiters ); 功 能: 查詢由在第二個串中指定的分界符分隔開的單詞, 即源串中除去了含有分隔串中的所有字元後餘下的一段段的字串,每呼叫一次找到

C重要字串函式strspn與strcspn

(1)函式strspn: size_t strspn ( const char * str1, const char * str2 ); 功 能: 在串中查詢指定字符集的子集的第一次出現,如果str1中的所有字元都在str2中出現過,那麼返回str1的長度。如果第一個字元就不在str2

如何檢視linux動態包含哪些函式

1、方法1 nm *.so 2、方法2 readelf -a *.so PS:readelf Options are: -a --all Equivalent to: -h -l -S -s -r -d -V -A -I

應用PHP GD影象處理函式製作驗證碼

<?php //開啟session,之後會把驗證碼存入session,然後在後端與使用者輸入的驗證碼對比 session_start(); //新建一個真彩色影象 $image=imagecreatetruecolor(100, 30); //定義白色

Python sklearn決策樹tree.DecisionTreeClassifier()函式引數介紹

max_leaf_nodes:int,None 可選(預設為None)    在最優方法中使用max_leaf_nodes構建一個樹。最好的節點是在雜質相對減少。如果是None則對葉節點的數目沒有限制。如果不是None則不考慮max_depth.class_weight:dict,list of dicts,

使用objdump檢視動態和靜態具有哪些函式

 我們在 Linux 下執行一個程式,有時會無法啟動,報缺少某某庫。這時需要檢視可執行程式或者動態庫中的符號表,動態庫的依賴項, Linux 有現成的工具可用:objdump 。 objdump 是 gcc 套件中用來檢視 ELF 檔案的工具,具體詳細用法不進行介紹,此

檔案getline函式的宣告已經存在

  /usr/include/stdio.h:651: note: previous declaration of ‘getline’ was here #include<stdio.h> #define MAXLINE 1000  /*maxinum inpu