插入排序:其基本操作就是将一个数据插入到已经拍好序的有序数据中,从而得到一个新的、个数加一 的有序数据,算法适用于少量数据的排序。
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置)
/*
直接插入排序
基本思想:
1,插入算法把要排序的数组分成两个部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即带插入元素)。在第一部分排序完成后,再将这个最后元素插入到已经拍好序的第一部分中。
2,每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
*/
NSMutableArray *array = [NSMutableArray arrayWithObjects:@12, @23, @3, @5, @43, nil];
for (NSInteger i = 1; i < array.count; i++) {
NSInteger temp = [array[i] integerValue];
NSInteger j = i - 1;
//与已排序的数逐一比较
while ((j >= 0) && ([array[j] integerValue] > temp)) {
array[j + 1] = array[j];
j--;
}
//存在大于temp的数,插入数组最前端
if (j != (i-1)) {
array[j + 1] = [NSNumber numberWithInteger:temp];
}
NSLog(@"%d--%@", i, array);
}
控制台打印:
1–(12, 23, 3, 5, 43)
2–(3, 12, 23, 5, 43)
3–(3, 5, 12, 23, 43)
4–(3, 5, 12, 23, 43)
第二种方法:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@12, @23, @3, @5, @43, nil];
for (int i = 1; i < array.count; i++) {
for (int j = i; j > 0; j--) {
if ([array[j] integerValue] < [array[j - 1] integerValue]) {
NSInteger temp = [array[j] integerValue];
array[j] = array[j - 1];
array[j - 1] = [NSNumber numberWithInteger:temp];
}
}
NSLog(@"%d--%@", i, array);
}