斗地主中的插入排序(java实现)

本文通过春节斗地主的场景,生动形象地讲解了插入排序的原理和过程。从摸牌、比较、插入,逐步解析插入排序的运作机制,讨论了其在不同情况下的时间复杂度,并引入了更高效的二分插入排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引导

     春节刚过不久,大家在春节闲来无事想必会呼朋唤友玩上几局惊险刺激的斗地主吧。其实在斗地主整理牌的过程中就是一个插入排序。大家细细琢磨一下,当摸牌时,第二张莫起来时,我们会与第一张牌比较,然后排序。莫第三张牌时,我们首先会很最右边的比较,如果小,我们又同右二牌比较,如果比右二大,我们就插在中间,如果小,我们就放在最左边。继续摸牌,继续这样比较,牌摸完了,也就整理完了。

2.特点

    2.1 在上述斗地主整理牌的过程中,我们会发现,当我们摸下一张牌前,始终手上的牌是有序的

    2.2时间复杂度:

   if我们每次摸牌时,摸到的牌都是比手中的牌大,那么每次排序就只需要比较与最右边的牌大小,也就是比较一次就行,所以时间复杂度为O(n).(正序

else假如我们摸牌时,摸到的牌比最左边的牌还小,那么每次排序就需要比较手中牌有几张就有几次的次数,所以时间复杂度为O(n*n).(反序

3.eg

4.代码展示

public static void inserrtSort(int[] arr){
    if(arr==null||arr.length<2){
        return;
    }
    for(int i=1;i<arr.length;i++){
        for(int j=i-1;j>-1 && arr[j]>arr[j+1];j--){
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
}

外层for循环是摸牌的次数,内层for循环是摸牌后整理牌,排序的过程。

 

5.改进(二分插入排序)

 大家仔细想一下我们摸牌的时候会从最右边一张一张的哈密哈眼的去比较吗???反正我是不会的,相信大家也不会。一般情况下摸牌起来的时候,我们会看一下摸上来的牌,然后从手上牌中间开始比较,这样比较的话,能快速 找到手中牌该插入的位置。所以二分插入排序出现了。

public static void erfenInsertSort(int[] arr){
    for(int i=1;i<arr.length;i++){
        int temp=arr[i]; //刚摸起来的牌
        int low=0,high=i-1;
        int mid=-1;
        while(low<=high){
            mid=low+(high-low)/2;
            if(arr[mid]>temp){
                high=mid-1;
            }else{
                low=mid+1;
            }
        }
        for (int j=i-1;j>=low;j--){
            arr[j+1]=arr[j];
        }
        arr[low]=temp;
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值