前言
各種排序方法中,例如冒泡、插入,快排等我最喜歡用快速排序,特別欣賞快排的分治思想,調用系統的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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

