c語言中qsort的用法(模擬EXCEL)
阿新 • • 發佈:2018-12-14
排序方法有很多種:選擇排序,氣泡排序,歸併排序,快速排序等。 看名字都知道快速排序是目前公認的一種比較好的排序演算法。因為他速度很快,所以系統也在庫裡實現這個演算法,便於我們的使用。 這就是qsort函式(全稱quicksort)。它是ANSI C標準中提供的,其宣告在stdlib.h檔案中,是根據二分法寫的,其時間複雜度為n*log(n)
功能: 使用快速排序例程進行排序 標頭檔案:stdlib.h 用法: void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 引數: 1 待排序陣列,排序之後的結果仍放在這個陣列中 2 陣列中待排序元素數量 3 各元素的佔用空間大小(單位為位元組) 4 指向函式的指標,用於確定排序的順序(需要使用者自定義一個比較函式
qsort要求提供一個自己定義的比較函式。比較函式使得qsort通用性更好,有了比較函式qsort可以實現對陣列、字串、結構體等結構進行升序或降序排序。
如比較函式 int cmp(const void *a, const void *b) 中有兩個元素作為引數(引數的格式不能變),返回一個int值,比較函式cmp的作用就是給qsort指明元素的大小是怎麼比較的。
//標頭檔案包含 #include<stdlib.h> #include<stdio.h> #include<malloc.h> #include <string.h> #include <string> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INFEASIBLE -2 #define maxn 100005 typedef struct student { char name[10], id[10]; int score; }student; int cmp(const void * a, const void * b) {//固定 強轉 student *aa = (student*)a; student *bb = (student*)b; return strcmp(aa->id, bb->id); } int cmp2(const void *a, const void *b) { student *aa = (student*)a; student *bb = (student*)b; int rel = strcmp(aa->name, bb->name); if (!rel) return strcmp(aa->id, bb->id); return rel; } int cmp3(const void *a, const void *b) { student *aa = (student*)a; student *bb = (student*)b; int rel = aa->score - bb->score;//如果是>比較的話 會出現問題 //printf("%d\n",rel);//a<b 得出的是0 但是事實是不能比較 所以會報錯 if (!rel) return strcmp(aa->id, bb->id); return rel; } int main() { int num; scanf("%d", &num); student* stu = (student *)malloc(sizeof(student)*num); int c; scanf("%d", &c); for (int i = 0; i < num; i++) { scanf("%s %s %d", stu[i].id, stu[i].name,& stu[i].score); } switch (c) { case 1:{ qsort(stu, num, sizeof(student), cmp); break; } case 2:{ qsort(stu, num, sizeof(student), cmp2); break; } case 3:{ qsort(stu, num, sizeof(student), cmp3); break; } } for (int i = 0; i < num; i++) { printf("%s %s %d\n", stu[i].id, stu[i].name, stu[i].score); } system("pause"); return 0; }