(TOJ1292)排序

描述

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是对这些分割得到的整数依从小到大的顺序排序。

输入

输入数据包含多行,每行为一串数字(数字之间没有空格),这行数字的长度不大于1000。 
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。处理到文件结束为止。

输出

对每行数字串进行分割并从小到大排序,输出排序后的结果,相邻的两个整数之间用一个空格分开。

样例输入

50051

0051231232050775

样例输出

0 1

0 77 12312320
 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <ctype.h>

 4 #include <math.h>

 5 

 6 char a[1001];

 7 __int64 b[1000];

 8 

 9  int split(__int64 a[], int low, int high)

10  {

11     __int64 part_element=a[low];

12     for(;;){

13     while(low<high&&part_element<=a[high])

14       high--;

15     if(low>=high) break;

16     a[low++]=a[high];

17   

18     while(low<high&&a[low]<=part_element)

19       low++;

20     if(low>=high) break;

21     a[high--]=a[low];

22     }

23     a[high]=part_element;

24     return high;

25  }

26  void quicksort(__int64 a[],int low,int high)

27  {

28     int middle;

29     if(low>=high)return;

30     middle=split(a,low,high);

31     quicksort(a,low,middle-1);

32     quicksort(a,middle+1,high);

33   }

34 void deal(char *s)

35 {

36     int len,i,j,k,m,flag;

37     __int64 t=0;

38     len=strlen(s);

39     i=j=k=flag=m=0;

40     while(i<len){

41         while(s[i]=='5') i++;

42       j=i;

43        while(j<len){

44           if(s[j]!='5') j++;

45           else  break;

46        }

47       for(k=i; k<j; k++)

48       {

49           

50           t=t*10+(s[k]-48);

51       }

52       if(i<len) b[m++]=t;

53       i=j;

54       flag=0; t=0;

55     }

56     quicksort(b,0,m-1);

57     printf("%I64d",b[0]);

58     for(i=1; i<m; i++)

59        printf(" %I64d",b[i]);

60     printf("\n");

61 }

62 

63 int main()

64 {

65     while(gets(a)){

66         deal(a);

67     }

68     return 0;

69 }

70 

71  
 

你可能感兴趣的:(排序)