洗牌算法
牌放到一个数组中,这里采用随机取下标的方式,交换两张牌。
将数组分为两个部分,一个部分为洗好的牌,和没有洗好的牌。从没有洗好的牌中随机选一张和没有洗好的第一张牌进行交换。这样洗好的牌数量加1,没有洗好的牌数量减1
时间复杂度O(n),空间复杂度O(1)
1 import java.util.Date; 2 import java.util.Random; 3 4 5 /** 6 * 模拟洗牌 7 * 洗牌算法的实现 8 * 随机取下标 9 * 将牌分为两个部分,0-i为洗好的牌,i+1 - 53为没有洗的牌 10 * i+1 - 53之间产生一个随机数index,交换i+1和index的牌 11 * 时间复杂度O(N),空间复杂度O(1) 12 * @author GXF 13 * 14 */ 15 public class MixUpCards { 16 17 /** 18 * 洗牌 19 * 时间复杂度O(N),空间复杂度O(1) 20 * @param array 21 */ 22 public void mixupCards(int array[]){ 23 Random random = new Random(new Date().getTime()); 24 25 for(int i = array.length - 1; i > 0; i--){ 26 int index = random.nextInt(i); 27 swap(array, i, index); 28 } 29 } 30 31 /** 32 * 交换数组元素 33 * @param array 34 * @param i 35 * @param j 36 */ 37 public void swap(int array[], int i, int j){ 38 int temp = array[i]; 39 array[i] = array[j]; 40 array[j] = temp; 41 } 42 43 }
分析算法需要从空间复杂度和时间复杂度进行分析,这样算法性能才具有可比性
Please call me JiangYouDang!