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

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