主要內容
鍵索引計數法
低位優先lsd
高位優先msd
三向字串快速排序
字串排序演算法總結比較
假定給定乙個字串數字,要求將該字串陣列排序。
規定字串中的字元全集基數為r,即字串中的每個字元都是字母表中某乙個字元,其索引為[0,r)。
假定給定的字串陣列為單個字元陣列,假定基數256即每個字元在字母表中的索引在0-255之間,類似於計數排序思想,使用count陣列來統計字母表中每個字元出現的次數,將每個字元出現的次數進行加和,得到每個字元在字元總數中的索引,然後遍歷待排序字元陣列,找到每個字元所在的起始索引,將字元陣列寫入到aux臨時陣列中,然後將aux陣列回寫到a中,完成排序。
private static int r = 256; //基數
//鍵索引計數法
//排序小整數鍵
//假定待排序的字串鍵值為0-r-1中的任意整數,每個字串對應乙個整數,現在按照字串的鍵值來排序
//類似於計數排序
public static void keyindexcount(char a)
//對於字串陣列從索引lo-hi利用字串的第d位字元鍵值索引來排序
private static void sort(string ss, int lo, int hi, int d)
//利用第d位字元鍵索引排序
//由於每次遞迴呼叫都需要新建new int[r+2],因此當切割成大量小陣列時,耗費空間太大
//當字串陣列完全相同或者字首相同太多時,該演算法效率下降
int count = new int[r+2];
for(int i=lo; i<=hi; i++)
for(int r=1; rlo&&less(ss[j], ss[j-1], d); j--)
} } private static void exch(string ss, int j, int i)
private static boolean less(string s1, string s2, int d)
//獲取字串s中第d位的索引,如果不存在則返回-1,然後將該值+1得到》=0值作為該字元在count陣列中的索引
private static int charat(string s, int d)
private static void quick3sort(string ss, int lo, int hi, int d)
//對於小於v部分遞迴排序
quick3sort(ss, lo, lt-1, d);
//對於等於v部分 由於第d位已經相等,從d+1位開始排序
if(v>=0)
quick3sort(ss, lt, gt, d+1);
//對於大於v部分遞迴排序
參考 《演算法第四版》
《演算法》 字串 字串排序
輸入字串和字串對應的組別 組別也是字串的鍵 在滿足組別有小到大排序的情況下,將字串按字母順序排序 第一步,記錄組別的頻率 為了得到某個字串在排序後的範圍,比如組別2肯定在組別1後面,在組別3前面,把每個組別有多少個人記錄下來,方便我們定位 第三步,分類 該組別的位置起點 向後挪一位 因為當前位被用了...
字串 字串排序
頻率統計 將頻率轉換為索引 資料分類 回寫頻率統計 統計每個字元出現的次數 將頻率轉換為索引 確定不同字元首位置 從右到左檢查檢查鍵中的字元 public class lsd public class msd public static void sort string a private stat...
字串排序
從鍵盤輸入10個學生的姓名和成績,請按字典序排列學生的姓名並輸出 姓名和成績對應關係保持不變 輸入共11行,前10行每行是乙個學生的姓名,最後一行是10個用空格分開的整數表示對應的10個學生成績。輸出姓名按字典序排列後的學生姓名和成績,共10行,每個學生的姓名和成績佔一行,姓名和成績間用逗號分開。b...