[UVa] 11321 Sort! Sort!! And Sort!!!

solution:自行修改cmp function
             對於理解qsort滿有幫助的一題

http://uva.onlinejudge.org/external/113/11321.html
#include
#include

typedef struct data{
int num;
int remainder;
}Data;
int cmp(const void *a,const void *b);


int main(void){
int n,m,i;
while (scanf("%d%d",&n,&m)==2 &&n&&m) {
Data data[n];
for (i = 0; i < n; i++) {
scanf
("%d",&data[i].num);
data
[i].remainder = data[i].num % m;
}
qsort
(data, n, sizeof(data[0]), cmp);
printf
("%d %d\n",n,m);
for (i=0;i<n; i++) {
printf
("%d\n",data[i].num);
}
}
printf
("0 0\n");
return 0;
}

int cmp(const void *a,const void *b){
Data c,d;
c
= *(Data*)a;
d
= *(Data*)b;
if (c.remainder != d.remainder)
return c.remainder>d.remainder?1:-1;
else{
if(c.num%2==0 && d.num%2==0){
if (c.num != d.num)
return c.num>d.num?1:-1; //若都是偶數,較小的排在前面,則回傳值依舊
return 0;
}
else if ((c.num%2==1||c.num%2==-1) && (d.num%2==1||d.num%2==-1)){
if (d.num != c.num)
return c.num>d.num?-1:1; //若都是奇數,較大的排在前面,則回傳值顛倒
return 0;
} //以下一奇一偶 奇數排在前面
else if ((c.num%2==1||c.num%2==-1) && d.num%2==0){
return -1; //c為奇數d為偶數,回傳-1維持cd順序
}
else
return 1; //d為奇數c為偶數,回傳1順序變dc
}
}

[C] 論qsort的cmp function

note: 先#include
note2:條件運算子
          運算式?x:y
          若運算式為真 答案為x 否則為y
note3:cmp的return值,for example:由小排到大
         if(a!=b)
             return *(int*)a>*(int*)b?1:-1; //a>b 回傳1,a<b回傳-1
         else
             return 0;//a=b回傳0
     
這樣說好了,如果我回傳1表示a>b,則順序要變ba
回傳-1表示a<b,順序ab不變
也就是說 回傳1就是順序顛倒,回傳-1就是順序不變

1.for int

qsort(data,n,sizeof(int),cmp);
cmp(const void *a,const void *b){
return *(int*)a - *(int*)b;
}

2.for char

qsort(data,n,sizeof(char),cmp);
cmp(const void *a,const void *b){
return *(char*)a - *(char*)b;
}

3.for double

qsort(data,n,sizeof(double),cmp);
cmp(const void *a,const void *b){
return *(double*)a > *(double*)b?1:-1;
}

4.for struct (參考UVa 11321)
//以sort值做排序

typedef struct sample{
double data,
int sort;
}Sample;
Sample sample[n];
qsort(sample,n,sizeof(sample[0]),cmp);
cmp(const void *a,const void *b){
return *(Sample*)a.sort > *(Sample*)b.sort ?1:-1;
}