《編程思維與實(shí)踐》1032.行數(shù)據(jù)的排序
題目


思路
類似于字符串的strcmp函數(shù),按要求寫出排序函數(shù)即可.
關(guān)鍵在于如何處理輸入的數(shù)據(jù),由于一行數(shù)據(jù)最多50個(gè)(不包括1),所以可以開一個(gè)大小51的數(shù)組,初始化為-1,但讀入的數(shù)據(jù)不為-1時(shí)存入數(shù)組.
數(shù)據(jù)大小不超過10^9,用int存即可.
代碼
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
? ?int *m=(int*)a;
? ?int *n=(int*)b;
? ?int i;
? ?while(*m!=-1&&*n!=-1)
? ?{
? ? ? ?if(*m!=*n)
? ? ? ?{
? ? ? ? ? ?return *n-*m; ? //從大到小
? ? ? ?}
? ? ? ?else{
? ? ? ? ? ?n++;
? ? ? ? ? ?m++;
? ? ? ?}
? ?}
? ?if(*n==-1&&*m!=-1)
? ?{
? ? ? ?return -1;
? ?} ?
? ?else
? ?{
? ? ? ?return 1;
? ?}
}
int main()
{
? ?int T;
? ?scanf("%d",&T);
? ?for(int i=0;i<T;i++)
? ?{
? ? ? ?int N;
? ? ? ?scanf("%d",&N);
? ? ? ?int tab[N][51]; ? //預(yù)留一個(gè)-1的位置
? ? ? ?for(int j=0;j<N;j++)
? ? ? ?{
? ? ? ? ? ?for(int k=0;k<51;k++)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?tab[j][k]=-1;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?for(int j=0;j<N;j++)
? ? ? ?{
? ? ? ? ? ?int k=0;
? ? ? ? ? ?int temp;
? ? ? ? ? ?while(scanf("%d",&temp)&&temp!=-1)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?tab[j][k++]=temp;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?qsort(tab,N,51*sizeof(int),cmp);
? ? ? ?for(int j=0;j<N;j++)
? ? ? ?{
? ? ? ? ? ?for(int k=0;tab[j][k]!=-1;k++)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?printf("%d ",tab[j][k]);
? ? ? ? ? ?}
? ? ? ? ? ?printf("\n");
? ? ? ?} ?
? ?}
? ?return 0;
}