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

来源:互联网 发布:淘宝粉丝怎么看 编辑:程序博客网 时间:2024/05/21 04:02

一、按照字母的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;}


0 0