华为2015实习上机:字符串排序

一、按照字母的ascii码顺序排序,其他非字母字符在字符串中位置不变

快速排序算法

可以看出,下面的程序就是一个快速排序算法,只是增加了对非英文字母的字符的处理:

快速排序参考文章快速排序的几种常见实现

//输入字符串,按照字母的ascii码顺序排序,其他非字母字符在字符串中位置不变
//如,输入Wor#d,输出Wdo#r
//快速排序实现

void QuickStrSort(char str[], int left, int right) {
    char pivot = str[left];
    int i = left, j = right;
    if (left < right) {
        while (i < j) {
            //j从右向左找第一个小于枢纽的字母,如果遇到不是字母的继续向前找
            while (i < j && 
                     (
                       (isalpha(str[j]) && str[j] >= pivot) || (!isalpha(str[j]))
                     )
                  )
                j--;
            str[i] = str[j];
            //i从左向右找第一个大于枢纽的字母,遇到不是字母继续向后找
            while (i < j && 
                ((isalpha(str[i]) && str[i] <= pivot) || (!isalpha(str[i])))
                )
                i++;
            str[j] = str[i];
        }
        str[i] = pivot;
        QuickStrSort(str, left, i - 1);
        QuickStrSort(str, i + 1, right);
    }
}
int main() {
    char str[102];
    while (1) {
        cin >> str;
        QuickStrSort(str, 0, strlen(str) - 1);
        cout << str << endl << endl;;
    }
    return 0;
}


冒泡排序

使用类似冒泡排序方法求解:

int main() {
	string str;
	getline(cin, str);
	int i, j;
	int len = str.length();
	for (i = 0; i < len - 1; i++) {
		for (j = 0; j < len - i - 1; j++) {
			//每趟找到第一个字母,然后找到该字母后的第一个字母
			//对这两个字母比较大小,若为逆序则交换它们
			if (isalpha(str[j])) {
				int k = j + 1;
				while (!isalpha(str[k]) && k < len - i - 1)
					++k;
				if (isalpha(str[k])) {
					if (str[j] > str[k]) {
						char temp = str[j];
						str[j] = str[k];
						str[k] = temp;
					}
				}
			}
		}
	}
	cout << str << endl;
	return 0;
}


二、另一类型

这个题目根据其规则2:要求同一字母(不区分大小写)按照输入顺序排列;所以不能再使用快速排序,因为快速排序是不稳定的,那么相同字母顺序在排序后可能会改变。

下面是类似冒泡解决方法:

int main()
{
	char str[1000];
	int i,j,k;
	int len = 0;
	char tmp;
	gets(str);
	len = strlen(str);
	for(i = 0; i < len-1; ++i)
	{
		for(j = 0; j < len-1-i; ++j)
		{
			k = j;
			//如果str[j]是一个字母,那么就寻找其后的第一个字母a
			//找到了,并且a大于str[j]那么就将它们交换
			if(isalpha(str[j]))
			{
				while(!isalpha(str[k+1]) && k < len-i-1)
					k++;

				if(isalpha(str[k+1]))
					if(tolower(str[j]) > tolower(str[k+1]))
					{
						tmp = str[j];
						str[j] = str[k+1];
						str[k+1] = tmp;
					}
			}
		}

	}
	puts(str);
	return 0;
}


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值