fork me on github

字母排序问题(c++实现)

描述:编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度 相同。例如:

     输入:

    THE PRICE OFBREAD IS ¥1 25 PER POUND

    输出:

    ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU

 并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。

分析:难点在待排序列中混有不相干的字符,我用的是冒泡排序法,在大写字母间进行比较,用一个函数返回和最大值交换的字母的下标。

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 //返回第k位前的一个大写字母的下标
 6 int cal(string a, int k)
 7 {
 8     for (int i = k; i >= 0; i--)
 9     {
10         if (a[i] >= 'A'&&a[i] <= 'Z')
11             return i;
12     }
13     return -1;
14 }
15 void exchange(string& a, int x, int y)
16 {
17     char swap = a[x]; a[x] = a[y]; a[y] = swap;
18 }
19 int main()
20 {
21     string a;
22     getline(cin, a);
23     int n=0;//记录大写字母的个数
24     for (int i = 0; i < a.size(); i++)
25     {
26         if (a[i] >= 'A'&&a[i] <= 'Z')
27             n++;
28     }
29     int start;//排序的初始值
30     for (int i = 0;; i++)
31     {
32         if (a[i] >= 'A'&&a[i] <= 'Z')
33         {
34             start = i; break;
35         }
36     }
37     int swap = cal(a,a.size()-1);//要交换的字母下标
38     for (int i = 0; i < n; i++)
39     {
40         int max = start;
41         for (int i = 0; i <= swap; i++)
42         {
43             if (a[i] >= 'A'&&a[i] <= 'Z'&&a[i]>a[max])
44                 max = i;
45         }
46         exchange(a, max, swap);
47         swap = cal(a, swap - 1);
48     }
49     cout << a << endl;
50     system("pause");
51     return 0;
52 }

 

posted @ 2015-08-13 22:22  烦嚣的人  阅读(4753)  评论(0编辑  收藏  举报