




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C函數qsort簡介和用法,新手入門C函數qsort實現快速排序排序方法有很多種:選擇排序,冒泡排序,排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。歸并排序,快速排序等。看名字都知道快速排序看名字都知道快速排序 是目前公認的一種是目前公認的一種比較好的排序算法,比選擇排序,冒泡排比較好的排序算法,比選擇排序,冒泡排序都要快。因為它的速度很快,所以系統序都要快。因為它的速度很快,所以系統也在庫里實現這個算法,便于我們的使用。也在庫里實現這個算法,便于我們的使用。這就是這就是qsort。qsort簡介 qsort函數是函數是ANSI C標準中提供的,其聲明在文標準中提供的,其聲明在文
2、件中,是根據二分發寫的,其時間復雜度為件中,是根據二分發寫的,其時間復雜度為n*log(n),其結構為:其結構為: void qsort(void *base,size_t nelem,size_t width, cmp); *base 為要排序的數組為要排序的數組 nelem 為要排序的數組的長度為要排序的數組的長度 width 為數組元素的大小(一字節為單位)為數組元素的大小(一字節為單位) 簡單示例:對簡單示例:對int num100排序,排序,qsort中各參數中各參數怎么寫?怎么寫? qsort(num,100,sizeof(num0),cmp);自定義比較函數 比較函數的名字是自定
3、義的(這里我們用CMP命名); Cmp:qsort 要求提供的這個函數是一個需要自己定義的比較函要求提供的這個函數是一個需要自己定義的比較函數,比較函數使得數,比較函數使得qsort通用性更好。有了比較函數通用性更好。有了比較函數qsort可以實可以實現對數組,字符串,結構體等結構進行升序或降序排序。現對數組,字符串,結構體等結構進行升序或降序排序。 Int Cmp(const void *a , const void *b )中有兩個元素作為參數,中有兩個元素作為參數,返回一個返回一個int值,值, 如果比較函數返回大于如果比較函數返回大于0,qsort就認為就認為 ab , 如果比較函數返
4、回等于如果比較函數返回等于0 qsort就認為就認為a 和和b 這兩個元素相等,返這兩個元素相等,返回小于零回小于零 qsort就認為就認為 ab),你比較函數卻返你比較函數卻返回一個回一個 -1 (小于零的)那么(小于零的)那么qsort認為認為ab 的,就把的,就把 b放到前面放到前面去,但實際上是去,但實際上是a大于大于b的,所以就造成升降序的差別了。的,所以就造成升降序的差別了。 簡單來說,比較函數的作用就是給簡單來說,比較函數的作用就是給qsort指明元素的大小是怎么指明元素的大小是怎么比較的。比較的。簡單示例:對簡單示例:對int num100中的元素從小到大排序。中的元素從小到大
5、排序。int num100; int cmp ( const void *a , const void *b ) return *(int *)a - *(int *)b; /強制轉換類型強制轉換類型 qsort(num,100,sizeof(num0),cmp); Cmp()定義了兩個const void(類型為空)的指針*a和*b;在*(int *)a - *(int *)b; 這句中把指針強制轉換為 int型;我們可以將const void 改為你需要排序對象的類型;int num100; int cmp ( int *a , int *b ) return *a - *b; qsort
6、(num,100,sizeof(num0),cmp);如果要對num100中的元素從大到小排序,只需要將return *a - *b改為return *b -*a 就可以實現;qsort簡單實例應用應用qsort對對int數組進行排序:數組進行排序:#include #include int cmp_1 ( int *a , int *b ) return *a - *b;int cmp_2 ( int *a , int *b ) return *b - *a;void main()int num10=1,3,5,7,9,2,4,6,8,0;int i;qsort(num,10,sizeof(
7、num0),cmp_1);/從小到大for(i=0;i10;i+)printf(%d ,numi);printf(n);qsort(num,10,sizeof(num0),cmp_2);/從大到小for(i=0;i10;i+)printf(%d ,numi);printf(n); 應用應用qsort對對char數組進行排序:數組進行排序:#include #include int cmp_1 ( char *a , char *b ) return *a - *b;int cmp_2 ( char *a , char *b ) return *b - *a;void main()char ch
8、10=bcadfegihj;int i;qsort(ch,10,sizeof(ch0),cmp_1);/從小到大for(i=0;i10;i+)printf(%c ,chi);printf(n);qsort(ch,10,sizeof(ch0),cmp_2);/從大到小for(i=0;i10;i+)printf(%c ,chi);printf(n);應用應用qsort對結構體一級排序:對結構體一級排序:#include #include struct coordint x;int y;data100;int cmp(struct coord *a ,struct coord *b) /根據根據y的
9、大小排序的大小排序 return a-y - b-y ;void main()int sum=0,n;int i,j;/freopen(in.txt,r,stdin);while(scanf(%d,&n)!=EOF&n)for(i=0;in;i+)scanf(%d %d,&datai.x,&datai.y);for(i=0;in;i+)printf(%d %d ,datai.x,datai.y);printf(n);qsort(data,n,sizeof(data0),cmp);for(i=0;in;i+)printf(%d %d ,datai.x,datai.
10、y);printf(n);輸入:輸入: 40 22 13 86 30應用應用qsort對結構體二級排序:對結構體二級排序:#include #include struct coordint x;int y;data100;int cmp(struct coord *a ,struct coord *b) if(a-x != b-x) return a-x - b-x; /按照按照x從小到大排序,當從小到大排序,當x相等時按照相等時按照y從大到小排序從大到小排序 else return a-y - b-y ; void main()int sum=0,n;int i,j;freopen(in.txt,r,stdin);while(scanf(%d,&n)!=EOF&n)for(i=0;in;i+)scanf(%d %d,&datai.x,&datai.y);for(i=0;in;i+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中地理野外實踐課程設計與應用論文
- 2024年度河南省二級造價工程師之建設工程造價管理基礎知識真題練習試卷B卷附答案
- 小學環保教育實驗:廚余堆肥蚯蚓糞對小白菜生長實驗觀察報告論文
- 中國醫藥行業用黃原膠行業市場前景預測及投資價值評估分析報告
- 節假日裝修管理制度
- 苯乙烯儲存管理制度
- 茶藝坊安全管理制度
- 調試組1019題庫題庫(500道)
- 一年級《古對今》課件
- 財務預算練習題及參考答案
- 國家開放大學2025年《創業基礎》形考任務2答案
- 養老護理員(高級)培訓課程-康復護理課件
- 供應商大會品質報告課件
- 職工《勞動法》與《勞動合同法》知識培訓課件
- 名師教學設計《Maybe you should learn to relax.》完整教學教案
- 08S305-小型潛水泵選用及安裝圖集
- 醫院手術患者術前術后訪視記錄單
- 機械原理課程設計-鎖梁自動成型機床運動方案設計說明書
- (完整版)PEP人教版小學四年級英語下冊全冊單詞表帶音標
- 上海光電心電圖機9620P資料
- 美的集團公司分權手冊
評論
0/150
提交評論