前言
各種排序方法中,例如冒泡、插入,快排等我最喜歡用快速排序,特別欣賞快排的分治思想,調(diào)用系統(tǒng)的qsort函數(shù)前希望大家也能了解一下快速排序的原理,參考鏈接見(jiàn):
http://blog.csdn.net/zinss26914/article/details/8043168
qsort函數(shù)原型
void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));
函數(shù)原型在<stdlib.h>中找到
參數(shù)詳解
base : 指向數(shù)組中第一個(gè)元素(如果只是對(duì)數(shù)組的一段區(qū)域進(jìn)行排序,那么要使base指向這段區(qū)域的第一個(gè)元素) nmemb : 要排序元素的數(shù)量 size : 每個(gè)數(shù)組元素的大小,用字節(jié)來(lái)衡量 compare : 指向比較函數(shù)的指針
重點(diǎn)
數(shù)組的元素可能是任何類(lèi)型的,甚至可能是結(jié)構(gòu)體或聯(lián)合,所以必須告訴函數(shù)qsort如何確定兩個(gè)數(shù)組元素哪一個(gè)“更小”。通過(guò)編寫(xiě)
比較函數(shù)
可以為qsort提供這些信息。當(dāng)給定兩個(gè)指向數(shù)組元素的指針p和q時(shí),比較函數(shù)必須返回一個(gè)整數(shù),如果*p小于*q,那么返回的數(shù)為負(fù)數(shù);如果*p等于*q,那么返回0.如果*p大于*q,返回正數(shù).按照這種結(jié)果返回,qsort對(duì)數(shù)組默認(rèn)是升序排序.如果想降序,只需要將上述結(jié)果返回值*-1即可
測(cè)試用例
int&&char數(shù)組排序(c代碼)
以int數(shù)組為測(cè)試?yán)樱M(jìn)行排序
#include <stdio.h> #include <stdlib.h> int compi(const void *a, const void *b) { const int *p = a; const int *q = b; return *p - *q; } int compd(const void *a, const void *b) { const int *p = a; const int *q = b; return (*p - *q) * (-1); } int main() { int a[1000]; int i, len, type; while(scanf("%d %d", &len, &type) != EOF) { for(i = 0; i < len; i ++) { scanf("%d", &a[i]); } switch(type) { case 1 : //遞增排序 qsort(a, len, sizeof(a[0]), compi); break; case 2 : //遞減排序 qsort(a, len, sizeof(a[0]), compd); break; } if(type == 1) { printf("遞增排序結(jié)果:\n"); }else { printf("遞減排序結(jié)果:\n"); } for(i = 0; i < len; i ++) { printf("%d ", a[i]); } printf("\n"); } return 0; }
測(cè)試結(jié)果:
結(jié)構(gòu)體數(shù)組排序
大同小異,簡(jiǎn)單的貼一道acm題,來(lái)說(shuō)明結(jié)構(gòu)體數(shù)組排序的方法吧
excel排序
題目描述: Excel可以對(duì)一組紀(jì)錄按任意指定列排序。現(xiàn)請(qǐng)你編寫(xiě)程序?qū)崿F(xiàn)類(lèi)似功能。 對(duì)每個(gè)測(cè)試用例,首先輸出1行“Case i:”,其中 i 是測(cè)試用例的編號(hào)(從1開(kāi)始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時(shí),按學(xué)號(hào)遞增排序;當(dāng) C=2時(shí),按姓名的非遞減字典序排序;當(dāng) C=3 時(shí),按成績(jī)的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績(jī)時(shí),則按他們的學(xué)號(hào)遞增排序。 輸入: 測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例的第1行包含兩個(gè)整數(shù) N (N<=100000) 和 C,其中 N 是紀(jì)錄的條數(shù),C 是指定排序的列號(hào)。以下有N行,每行包含一條學(xué)生紀(jì)錄。每條學(xué)生紀(jì)錄由學(xué)號(hào)(6位數(shù)字,同組測(cè)試中沒(méi)有重復(fù)的學(xué)號(hào))、姓名(不超過(guò)8位且不包含空格的字符串)、成績(jī)(閉區(qū)間[0, 100]內(nèi)的整數(shù))組成,每個(gè)項(xiàng)目間用1個(gè)空格隔開(kāi)。當(dāng)讀到 N=0 時(shí),全部輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。 輸出: 對(duì)每個(gè)測(cè)試用例,首先輸出1行“Case i:”,其中 i 是測(cè)試用例的編號(hào)(從1開(kāi)始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時(shí),按學(xué)號(hào)遞增排序;當(dāng) C=2時(shí),按姓名的非遞減字典序排序;當(dāng) C=3 時(shí),按成績(jī)的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績(jī)時(shí),則按他們的學(xué)號(hào)遞增排序。 樣例輸入: 3 1 000007 James 85 000010 Amy 90 000001 Zoe 60 4 2 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0 樣例輸出: Case 1: 000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2: 000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3: 000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90
ac代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char num[7]; char name[9]; int grade; }; int compareByNum(const void *a, const void *b); int compareByName(const void *a, const void *b); int compareByGrade(const void *a, const void *b); int main() { int i, n, k; struct student people[100001]; static int size = 1; while(scanf("%d %d", &n, &k) != EOF) { if(n == 0) break; //接收客戶(hù)端數(shù)據(jù) for(i = 0; i < n; i ++) { scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade); } //快速排序 switch(k) { case 1 : //按學(xué)號(hào)排序 qsort(people, n, sizeof(people[0]), compareByNum); break; case 2 : //按姓名排序 qsort(people, n, sizeof(people[0]), compareByName); break; case 3 : //按成績(jī)排序 qsort(people, n, sizeof(people[0]), compareByGrade); break; } //打印輸出 printf("Case %d:\n", size ++); for(i = 0; i < n; i ++) { printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade); } } return 0; } int compareByNum(const void *a, const void *b) { const struct student *p = a; const struct student *q = b; return strcmp(p->num, q->num); } int compareByName(const void *a, const void *b) { const struct student *p = a; const struct student *q = b; if(strcmp(p->name, q->name) > 0) { return 1; }else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0) { return 1; }else { return -1; } } int compareByGrade(const void *a, const void *b) { const struct student *p = a; const struct student *q = b; if(p->grade > q->grade) { return 1; }else if(p->grade == q->grade && strcmp(p->num, q->num) > 0) { return 1; }else { return -1; } }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
