有序数组的随机排列
问题描述
将一个有序数组随机排列,模拟扑克牌洗牌的场景。
这是我曾经面试到过的一个小算法题,今天整理出几种方法。
解决方法一:数组元素之间进行随机交换
数组有n个元素,那么就有n的阶乘中排列方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| NSMutableArray *arrCards = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil]; int i = 0; int j = 1; while (i<arrCards.count) { j *= (i+1); i++; }; int k =0; NSString *tmp; int ran1 = 0; int ran2 = 0; while (k<=j) { ran1 = arc4random() % arrCards.count; ran2 = arc4random() % arrCards.count; tmp= [arrCards objectAtIndex:ran1]; [arrCards replaceObjectAtIndex:ran1 withObject:[arrCards objectAtIndex:ran2]]; [arrCards replaceObjectAtIndex:ran2 withObject:tmp]; k++; } for (NSString *cardNum in arrCards) { NSLog(@"%@",cardNum); }
|
解决方法方法二:自身随机插入
1 2 3 4 5 6 7 8 9 10 11 12 13
| i = arrCards.count-1; while (i) { tmp = [arrCards objectAtIndex:i]; [arrCards removeObjectAtIndex:i]; [arrCards insertObject:tmp atIndex:ran1]; i--; } for (NSString *cardNum in arrCards) { NSLog(@"%@",cardNum); }
|