華為2015實習上機:字串排序
阿新 • • 發佈:2019-02-19
一、按照字母的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; }