1. 程式人生 > >華為2015實習上機:字串排序

華為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;
}