排序 --- 插入排序
2019-07-31 本文已影响0人
挽弓如月_80dc
插入排序是一种简单直观且稳定的排序算法。
基本操作是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
算法步骤
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

算法实现
C
/*
* 直接插入排序
*
* 参数说明:
* a -- 待排序的数组
* n -- 数组的长度
*/
void insert_sort(int a[], int n)
{
int i, j, k;
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--)
if (a[j] < a[i])
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//在已经排序数列中,将比a[i]大的数据向后移;
//因为在后移过程中会覆盖a[i],所以用临时变量保存
int temp = a[i];
for (k = i - 1; k > j; k--)
a[k + 1] = a[k];
//将a[i]放到正确位置上
a[k + 1] = temp;
}
}
}
// 数组长度
#define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
void main() {
int i;
int a[] = {20,40,30,10,60,50};
int ilen = LENGTH(a);
printf("before sort:");
for (i=0; i<ilen; i++) {
printf("%d ", a[i]);
}
printf("\n");
insert_sort(a, ilen);
printf("after sort:");
for (i=0; i<ilen; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
OC实现
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"5",@"7",@"1",@"4",@"5"]];
NSLog(@"排序前:%@",arr);
int i, j;
NSString *temp;
for (i = 1; i < arr.count; i++) {
temp = arr[i];
j = i-1;
#比较与移动同时进行
while (j>-1 && [temp integerValue] < [arr[j] integerValue]) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
NSLog(@"排序后:%@",arr);
排序前:(
5,
7,
1,
4,
5
)
排序后:(
1,
4,
5,
5,
7
)
时间复杂度
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,直接插入排序的时间复杂度是O(n²)。
稳定性
比较稳定的算法