算法04-棋牌游戏常用排序算法

原创 2018年04月16日 17:58:36

算法04-棋牌游戏常用排序算法

一、介绍

棋牌游戏常用排序算法包括:链式基数排序、插入排序、希尔排序。

二、链式基数排序

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

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;
        }
    }

}

demo已上传gitee,需要的同学可以下载!

上一篇:算法03-分治法

下一篇:算法05-减治法

【算法】几种常用排序算法

1. 冒泡排序(Bubble Sort) 冒泡排序算法需要遍历几次数组,在每次遍历中,比较 连续相邻 的元素。如果某一对元素是降序,则互换它们的位置;否则,保持不变。冒泡排序法需要遍历 n-1 次数组...
  • Coding_Fox
  • Coding_Fox
  • 2016-01-18 16:31:40
  • 1870

棋牌游戏源码,扑克洗牌、发牌算法源、拱猪扑克牌C#

  • 2012年07月12日 08:53
  • 339KB
  • 下载

常见娱乐棋牌游戏算法

  • 2011年01月01日 18:25
  • 3.67MB
  • 下载

七大常见排序算法总结

插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序...
  • lutianfeiml
  • lutianfeiml
  • 2016-07-19 19:56:57
  • 8386

关于数据库排序算法总结

1. 内部排序 插入类排序 直接插入排序 折半插入排序 希尔排序 交换类排序 冒泡排序 快速排序 ...
  • dearwind153
  • dearwind153
  • 2012-05-03 22:33:22
  • 916

几种常用排序算法的思路和复杂度对比

1、插入排序——直接插入排序、希尔排序 (1)直接插入排序思路:从第1号元素开始,每个元素依次与前面的元素做比较,小的排前面,这样当比较到最后一 个元素完即完成排序。 (2)希尔排序思路:...
  • Wengwuhua
  • Wengwuhua
  • 2016-05-17 21:29:09
  • 560

七种常用排序算法

七种常用排序算法 一、常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间。 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度。 稳定性:保证排序前2个相...
  • woaini454186694
  • woaini454186694
  • 2016-06-20 17:39:51
  • 2846

常见排序算法时间对比

  • Walker19900515
  • Walker19900515
  • 2015-06-16 10:26:18
  • 618

7种常用排序算法总结:

7种排序算法总结: 整理的时候资源来自网络。不妥的联系我。谢谢。 事实上,目前还没有十全十美的排序算法,有优点就会有缺点,即使是快速排序法,也只是在整体性能上优越,它也存在排序不稳定、需要大量辅助空间...
  • wangwei890702
  • wangwei890702
  • 2012-11-18 23:05:54
  • 3048

常用的排序算法和时间复杂度

1. 数据结构部分 数据结构中常用的操作的效率表 通用数据结构 查找  插入   删除 遍历  数组 O(N) O(1) ...
  • xiangzhihong8
  • xiangzhihong8
  • 2016-05-31 17:53:42
  • 4458
收藏助手
不良信息举报
您举报文章:算法04-棋牌游戏常用排序算法
举报原因:
原因补充:

(最多只允许输入30个字)