字串排序演算法

2021-09-21 01:12:17 字數 1585 閱讀 6519

主要內容

鍵索引計數法

低位優先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...