字母排序


問題描述:實現對一組無序的字母進行從小到大排序(區分大小寫),當兩個字母相同時,小寫字母放在大寫字母前。要求時間復雜度為O(n).

分析:如果沒有時間復雜度的要求,可以采用傳統的插入排序或快速排序的算法,但是傳統的排序算法最好的時間復雜度為O(nlogn),不能滿足題目的要求。對於時間復雜度高的問題,可以使用空間換時間的方法,可采用以下思路:使用長度為52的整形數組,用來存儲每個字母出現的個數,數組的偶數下標存放小寫字母,奇數下標存放大寫字母(aAbB...zZ),當記錄完成后,可以遍歷數組按照各個字母出現的次數重組排序后的數組。

package com.wyl; /** * 字母排序 * 問題描述:實現對一組無序的字母進行從小到大排序(區分大小寫),當兩個字母相同時, * 小寫字母放到大寫字母之前。要求時間復雜度為O(n) * @author wyl * */
public class CharacterSort { /** * 聲明一個長度為52的數組,代表52個字母,用來存放每個字母出現的個數 */
    public static void charSort(char[] arr){ if(arr == null){ //數組為空
            System.out.println("輸入參數不合法"); return; } int[] chars = new int[52]; //聲明長度為52的數組,代表52個字母,用來保存字母出現的次數 //數組的偶數位存放小寫字母出現的次數,奇數位存放大寫字母出現的次數
        for(int i=0;i<arr.length;i++){ if(arr[i]>='a' && arr[i]<='z'){ //出現小寫字母,存放在偶數位
                chars[(arr[i]-'a')*2]++; }else if(arr[i]>='A' && arr[i]<='Z'){ //出現大寫字母,存放在奇數位
                chars[(arr[i]-'A')*2 + 1]++; } } //根據chars數組中的個數,改變arr中字母的順序
        int index = 0; for(int i=0;i<chars.length;i++){ if(chars[i]>0){//個數大於0 
                if(i%2 == 0){//偶數位,為小寫字母
                    for(int j=0;j<chars[i];j++){ //個數是多少就打印多少次
                        arr[index++] = (char) ('a'+ i/2); } }else{ for(int j=0;j<chars[i];j++){ //個數是多少就打印多少次
                        arr[index++] = (char) ('A'+ (i-1)/2); } } } } } public static void main(String[] args) { char[] chars = {'A','a','C','F','d','B','c','C'}; charSort(chars); for(int i=0;i<chars.length;i++){ System.out.print(chars[i]+" "); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM