2007年5月18日

qsort.test2.c


有人要的


輸入

12 3 9 8 4 8 7 4 8 9 6 9 8 3

結果

8 7 4

8 9 6

9 8 3

9 8 4

輸入時12為個數,3為每3個一組排列(12要被3整除),先比較第一個元素,比較小的先印出,如果一樣在繼續比第二個...依此類推


必須用qsort函式void (void *base,size_t num,size_t size,int (*comp_func)(const void *,const void *))


// 2007/5/18 17:28-18:25

//g++ -pipe -o p4 p4.cpp && p4 12 3 9 8 4 8 7 4 8 9 6 9 8 3

#include <stdlib.h>

#include <stdio.h>



int compar_func(const void* a, const void* b){

 int *p1=(int*)a,*p2=(int*)b,l1=*p1,l2=*p2,l=l1>l2?l2:l1,i=0;

 while(i<=l&&*++p1==*++p2);

 return i<=l?*p1-*p2:l1==l2?0:l1>l2?1:-1;

}



int main(int argc,const char *argv[]){

 if(argc<4)return 1;

 const int group_length=atoi(argv[2]),group_count=(argc-3+group_length-1)/group_length,nums_length=group_count*(group_length+1);

 int* nums=(int*)malloc(nums_length*sizeof(int));

 if(nums==NULL){printf("I can't allocates memory!");return 1;}

 for(int i=0,j=3,*p=nums;i<nums_length;i++)

  *p++=j<argc?i%(group_length+1)==0?group_length:atoi(argv[j++]):0;



 qsort(nums, group_count, (group_length+1)*sizeof(*nums), compar_func);



 for(int i=0,*p=nums;i<nums_length;i++)

  if(i%(group_length+1)==0)printf("\n"),p++;

  else printf("%d ",*p++);

 printf("\n");



 free(nums);

 return 0;

}

沒有留言: