程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> qsort 函數的用法

qsort 函數的用法

編輯:關於C語言
 

今天再做作業時需要用到排序,百度了下qsort函數,學習了。
codeqsort()

一、 簡介

qsort()包含在ANSI C庫中,qsort()根據給定的比較條件、通過指針移動實現快速排序,排序之後的結果仍然放在原數組中。使用qsort函數必須自己寫一個比較函數。 C++ STL中有sort()函數,可視為qsort()的改進版本。我們知道,在面對比較大的數組時,經過一定次數的快速排序迭代以後,數組經基本有序,所以在運行插入排序的時候,只需要很少數量的比較和交換就可以完成排序。sort()函數利用這一性質進行了算法優化,會根據數據量大小選擇合適的排序算法,基本解決了qsort()在某些情況下會產生退化的問題。

二、 使用說明

qsort()包含在stdlib.h頭文件中,其函數原型如下:

void qsort ( void * base, size_t num, size_t size, int ( *
comparator ) ( const void *, const void * ) )

參數說明:

base
-
數組起始地址
num
-
數組元素個數
size
-
每一個元素的大小
comparator
-
函數指針,指向比較函數
Return Value
-
無返回值

對於
comparison
函數,有一下兩點說明:

1) 該函數有兩個形參,兩個形參均指向將用於比較的兩個元素,這兩個形參被強制轉換為void*. 在這個函數中,這兩個形參將被重新類型轉換為元素本身的類型,並且進行比較。
2) 返回值為一個負值、0、正值,分別代表第一個元素與第二個元素的大小關系:小於,等於,大於。

1. 對int/char類型數組排序

int num[100];

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

{

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

}

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

2. 對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);

3. 對結構體一級排序

struct Sample

{

double data;

int other;

}s[100]

//按照data的值從小到大將結構體排序

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

{

return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;

}

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

4. 對結構體二級排序

struct Sample

{

int x;

int y;

}s[100];

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

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

{

struct Sample *c = (Sample *)a;

struct Sample *d = (Sample *)b;

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

else return d->y - c->y;

}

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

5. 對字符串進行排序(字典序)

struct Sample

{

int data;

char str[100];

}s[100];

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

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

{

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

}

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

Tips:要准備記住compare函數的寫法可能比較難,其實也可以寫成C++的版本:

bool cmp2(const int& x, const int& y)

{

return x < y;

}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved