排序算法-直接插入排序
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。
即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:
代码如下:
void insertSort(int a[],int length){
for (int i =1; i< length; i++) {
if (a[i] < a[i-1]) {//后面的元素小于前面,进行插入
int j = i;
int sentryX = a[i]; //哨兵
a[i] = a[i-1]; //后移一个元素
while (j>0 && sentryX < a[j-1]) {
a[j] = a[j-1];//元素后移
j--;
}
a[j] = sentryX; //插入到正确位置
}
}
}
对应OC版本的实现:
- (void)insertSort:(NSMutableArray *)array{
for (NSInteger i = 1; i< [array count]; i++) {
NSNumber *iNumber = array[i];
NSNumber *iPreviousNumber = array[i-1];
if (iNumber.integerValue < iPreviousNumber.integerValue) {
NSNumber *sentryNumber = array[i];//哨兵
array[i] = array[i-1];
NSInteger tempIndex = i; //标记位置
while (tempIndex > 0 && sentryNumber.integerValue < ((NSNumber *)array[tempIndex-1]).integerValue ) {
array[tempIndex] = array[tempIndex-1]; //元素后移
tempIndex--;
}
array[tempIndex] = sentryNumber;//哨兵插入到正确位置
}
}}
时间复杂度:O(n^2).