有序数组的随机排列

有序数组的随机排列

问题描述

将一个有序数组随机排列,模拟扑克牌洗牌的场景。
这是我曾经面试到过的一个小算法题,今天整理出几种方法。

解决方法一:数组元素之间进行随机交换

数组有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);
}
隐藏