(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  
 
原文地址:https://www.cnblogs.com/xueda120/p/3096091.html