北理工2011年计算机复试上机题(二)

题目说明:

.输入一组单词,(区分大小写),输出这些单词的字典排序。。。

 

解题思路:

既然区分大小写,肯定不能用简单的sort了事,因为sort会把大写排在小写前面,看来默认的sort的内部实现机制还是按照ASCII码也就是int类型来比较的。此题很显然不管是大写的A还是小写的a都应该排在b,B之前,所以考虑用归并实现,也就是先对大小写各自排序,再插入到默认容器中。

 

代码:

#include <iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	vector<string> str;
	vector<string> str2;
	vector<string> answer;
	string s;
	int i,j;
	while(cin>>s)
	{
		//小写的
		if(s[0]>=97)
		{
			str.push_back(s);
		}
		//大写的
		else
		{
			str2.push_back(s);
		}
	}
	//把小写的排序
	stable_sort(str.begin(),str.end());
	//大写排序
	stable_sort(str2.begin(),str2.end());

	i=0;
	j=0;

	while(i<str.size()&&j<str2.size())
	{
		// a <B
		if(str[i][0]-32<str2[j][0])
		{
			answer.push_back(str[i]);
			i++;
		}
		//b> A
		if(str[i][0]-32>str2[j][0])
		{
			answer.push_back(str2[j]);
			j++;
		}
		//a==A
		if(str[i][0]-32==str2[j][0])
		{
			answer.push_back(str[i]);
			answer.push_back(str2[j]);
			i++;
			j++;

		}


	}
	//小写未排完
	if(i<str.size())
	{
		while(i<str.size())
		{
			answer.push_back(str[i]);
			i++;
		}
	}

	//大写未排完
	if(j<str2.size())
	{
		while(j<str2.size())
		{
			answer.push_back(str2[j]);
			j++;
		}
	}


	for(i=0;i<answer.size();i++)
	{
		cout<<answer[i]<<endl;

	}
		

	system("pause");
	return 0;
}


 

说明:

注意stable_sort和sort的区别

sort 对给定区间所有元素进行排序
stable_sort 对给定区间所有元素进行稳定排序

比如:
B A(1) D A(2) C
按照字符排序,如果sort结果可能是
A(2) A(1) B C
如果stable_sort,结果肯定是
A(1) A(2) B C也就是说两个相同字符A的相对顺序不会被打乱,而使用sort则有可能被打乱。

 

你可能感兴趣的:(c,System)