算法 第四版 2.1.14 出列排序

本文探讨了一种特殊的排序问题,如何利用只能查看并操作最顶部两张牌的限制,对一副扑克牌进行排序。借鉴冒泡排序的思想,通过调整数组的操作方式,实现了在每次操作中固定交换前两张牌或将顶部一张牌移动到底部,以此逐步达到整个牌组的有序状态。

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

说说你会如何将一副扑克牌排序,限制条件是只能查看最上面的两张牌,交换最上面的两张牌,或是将最上面的一张牌放到这摞牌的最下面。


思路:模仿冒泡排序

冒泡排序是移动i(即数组指针),而我们可以通过移动数组来近似实现

我们可以固定交换前两个,移动数组


package Cap2_1;

import edu.princeton.cs.introcs.StdIn;
import edu.princeton.cs.introcs.StdOut;
import edu.princeton.cs.introcs.StdRandom;

public class Test extends Shell{
	public static void sortX(Comparable[] a){
		int N = a.length;
		while(!isSorted(a)){
			for(int j=0;j<N-1;j++){
				if(less(a[1], a[0])) {  
					exch(a, 0, 1);   //第一张和第二张交换
				}
				for(int z=0;z<N-1;z++) exch(a, z, z+1); //第一张放到最后
			}

			for(int z=0;z<N-1;z++) exch(a, z, z+1);
		}
	}
	public static void main(String[] args) {
		for(int i=0;i<10;i++){
			int N = 10+i*10;
			Integer[] a = new Integer[N];
			for(int j=0;j<N;j++)
				a[j] = (int)(StdRandom.random()*N);

			StdRandom.shuffle(a);
			sortX(a);
//			show(a);
			assert Shell.isSorted(a);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值