棋牌游戲常用排序算法


一、介紹

棋牌游戲常用排序算法包括:鏈式基數排序、插入排序、希爾排序。

二、鏈式基數排序

1、基本思想

基數排序(Radix sort)屬於“分配式排序”(distribution sort),它根據數據元素的某一特征將這些元素分成m組,然后再根據另一特征對組中的元素進行排序,即將一組數據變成m組排好序的數據。基數排序法是屬於穩定性的排序。

鏈式基數排序是按數據元素特征的優先級排序的基數排序,先按低優先級的特征,將這些元素分成m組,然后按照一定的順序將它們串聯成一組數據;然后再按高優先級的特征進行分組和串聯。這樣排好序后,就變成按多特征排序的一組數據。

鏈式基數排序用於棋牌游戲洗牌。

2、代碼實現

/** * 這里以麻將的排序來說明 * @param list 麻將集合 */ public static void linkedRadixSort(LinkedList<MaJiang> list) { if (Tool.isEmpty(list)) { return; } //先按點數分組 LinkedList<MaJiang>[] rankList = new LinkedList[9]; for (int i = 0; i < rankList.length; i++) { rankList[i] = new LinkedList<MaJiang>(); } //按點數添加數據 while (list.size() > 0) { MaJiang mj = list.remove(); rankList[mj.rank - 1].add(mj); } //合並分組 for (int i = 0; i < rankList.length; i++) { list.addAll(rankList[i]); } // 再按花色分組 rankList = new LinkedList[3]; for (int i = 0; i < rankList.length; i++) { rankList[i] = new LinkedList<MaJiang>(); } //按花色添加數據 while (list.size() > 0) { MaJiang mj = list.remove(); rankList[mj.suit - 1].add(mj); } //合並分組 for (int i = 0; i < rankList.length; i++) { list.addAll(rankList[i]); } } 

三、插入排序

1、基本思想

插入排序的基本思想是:每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的文件中適當位置上,直到全部插入完為止。

插入排序適用於幾乎已經排好序的數據,比如:棋牌游戲的插牌。

2、代碼實現

/** * @param arr 要排序的數組 */ public static <E extends Comparable<E>> void insertSort(E[] arr) { if (arr == null || arr.length == 0) { return; } //從前往后排序,先把前面所有的元素排好序,然后把后面的元素插到前面拍好的隊列中 for (int i = 1; i < arr.length; i++) { E temp = arr[i]; int j = i; //找到需要插入的位置 while (j > 0 && temp.compareTo(arr[j - 1]) < 0) { //后移一位 arr[j] = arr[j - 1]; j--; } arr[j] = temp; } } 

四、希爾排序

1、基本思想

希爾排序(Shell's Sort)是將整個有序序列分割成若干小的子序列分別進行插入排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。

排序過程:先取一個小於n的整數d1作為第一個增量(也叫步長),把文件的全部記錄分組。所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然后,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量 =1( < …<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。

希爾排序適合數組大部分有序的情況。希爾排序的效率還跟它的增量有關,適合的增量為:1,4,10,100..

2、代碼實現

/** * @param arr 要排序的數組 */ public static <E extends Comparable<E>> void shellSort(E[] arr) { if (Tool.isEmpty(arr)) { return; } shellSort(arr, 4); shellSort(arr, 1); } /** * 按步長進行希爾排序 * @param arr 要排序的數組 * @param step 步長 */ public static <E extends Comparable<E>> void shellSort(E[] arr, int step) { if (Tool.isEmpty(arr)) { return; } for (int m = 0; m < step; m++) { for (int i = m + step; i < arr.length; i += step) { E temp = arr[i]; int j = i; //與上一個步長的數據比較 while (j - step >= 0 && temp.compareTo(arr[j - step]) < 0) { //后移一個步長位 arr[j] = arr[j - step]; j -= step; } arr[j] = temp; } } }




免責聲明!

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



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