插入排序的思想:
可以想象你在打牌,手里有一张牌2,
第一次摸到一张牌5; 5 比2 大,所以摸到的牌5放在2的右边; (此时手里的牌为 2->5)
第二次摸到一张牌3; 3比5小,所以3和5互换位置,再拿3和2比,3比2大,3不动(此时手里的牌为 2-> 3 -> 5)
第三次摸到一张牌1,1比5小,所以1和5互换位置;再拿1和3比,1比3小,所以1和3互换位置;再拿1和2比,1比2小,所以1和2互换位置;
代码为:
- (NSMutableArray *)insertArray:(NSMutableArray *)array
{
NSString * key;
for (int i = 1; i < array.count; i ++)
{
/*
摸到的牌(必须用一个临时的key存住array[i],后面比大小就用key比较; 不能直接用array[i],
因为array会有变化,导致array[i] 也会有变化)
*/
key = array[i];
int j = i -1; //手机的第一张牌
while (j >= 0 && [array[j] intValue] > [key intValue])
{
[array exchangeObjectAtIndex:j+1 withObjectAtIndex:j];
j -- ;
}
}
return array;
}
插入排序还有另一种写法,我个人觉得比较难理解:
就是比较牌的时候不交换位置,仅仅是把大的牌往后移,最后再把摸到的牌放到它该去的地方:
代码如下:
- (NSMutableArray *)insertArray:(NSMutableArray *)array
{
//插入排序写法2.
int j = 0;
NSString * tempI; //每一次摸到的牌
for (int i = 1; i < array.count; i ++) //i表示摸到的牌的下标
{
tempI = array[i];
j = i -1; //j 指的是手里的牌的下标
while (j >= 0 && [array[j] intValue]> [tempI intValue])
{
array[j+1] = array[j];
j -= 1;
}
array[j+1] = tempI;
NSLog(@"插入排序,第 %d 轮后 array===%@",i,[array componentsJoinedByString:@" "]);
}
return array;
}