標籤:turn sort 正數 pre include rcm div 數組 結構體
qsort對結構體數組進行排序時,可以根據結構體元素中的任意某個成員進行比較之後,如果要交換則會連帶結構體中其他成員的一起進行整體的結構體元素交換
所以感覺真是萬能排序介面
只進行對結構體的一級排序
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct _stu{ char name[10]; float score;}Stu;int callBackCompare(const void * pa, const void * pb)//一級升序{#if 0//正確 if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0) return 1; else return 0;//或return -1;都行,畢竟qsort只對正數感興趣#endif#if 1 //正確 if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 ) return 1; else return 0;//或return -1;都行,畢竟qsort只對正數感興趣#endif}int main(void){ Stu stu[] = {{"aaa",23.5}, {"xxx",45.6}, {"bbb",89}, {"xxx",23.4}, {"yyy",100}}; qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare); int i; for(i = 0;i<5;i++) { printf("%s,%f\n",stu[i].name,stu[i].score); } return 0;}
對結構體一級排序的同時進行二級排序
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct _stu{ char name[10]; float score;}Stu;int callBackCompare(const void * pa, const void * pb)//一級升序二級降序{#if 0//正確 if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0)//對1級進行升序 return 1; else { if( (*(Stu*)pa).score < (*(Stu*)pb).score )//對2級進行降序 { return 1; } else return 0; }#endif#if 0 //正確 if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 ) return 1; else { if( ((Stu*)pa)->score < ((Stu*)pb)->score )//對2級進行降序 { return 1; } else return 0; }#endif}int main(void){ Stu stu[] = {{"aaa",23.5}, {"xxx",45.6}, {"bbb",89}, {"xxx",23.4}, {"yyy",100}}; qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare); int i; for(i = 0;i<5;i++) { printf("%s,%f\n",stu[i].name,stu[i].score); } return 0;}
4.19 使用qsort對結構體數組進行排序,實現對結構的體一級排序和二級排序,進一步瞭解qsort的原理