直接插入排序思想是将待排序元素一个一个插入到已排序队列:由于一个元素不存在排序,因此从第二个元素起,将第二个元素之前的元素(也就是第一个元素)看成是已排序队列,将第二个元素与已排序队列比较,找到合适位置并插入;依此类推,将剩下元素插入到已排序队列,完成排序。
时间复杂度:O(N^2)
稳定性:稳定
注:时间复杂度与选择(冒泡)排序一样,而代码逻辑看起来比选择(冒泡)排序难理解。
测试结果:
待排序:6 3 4 2 5 1
升序:1 2 3 4 5 6
降序: 6 5 4 3 2 1
源码(insert_sort.c):
#include <stdio.h>
#define ARRAY_N 6
int array[ARRAY_N]={6, 3 , 4, 2, 5, 1};
int show_list(int array[], int n)
{
int i = 0;
for (i=0; i < ARRAY_N; i++)
{
printf("%5d", array[i]);
}
printf("\n");
return 0;
}
int insert_sort_asc(int array[], int n)
{
int i = 0;
int j = 0;
int k = 0;
int tmp = 0;
for (i = 1; i < n; i++)
{
for (j = i - 1; j >=0; j--)
{
if (array[i] > array[j])
{
break;
}
}
if (j != i - 1)
{
tmp = array[i];
for (k = i - 1; k > j; k--)
{
array[k + 1] = array[k];
}
array[k + 1] = tmp;
}
}
printf("\n");
return 0;
}
int insert_sort_des(int array[], int n)
{
int i = 0;
int j = 0;
int k = 0;
int tmp = 0;
for (i = n - 2; i >=0 ; i--)
{
for (j = i + 1; j < n; j++)
{
if (array[i] > array[j])
{
break;
}
}
if (j != i + 1)
{
tmp = array[i];
for (k = i + 1; k < j; k++)
{
array[k - 1] = array[k];
}
array[k - 1] = tmp;
}
}
printf("\n");
return 0;
}
int main(void)
{
show_list(array, ARRAY_N);
insert_sort_asc(array, ARRAY_N);
show_list(array, ARRAY_N);
insert_sort_des(array, ARRAY_N);
show_list(array, ARRAY_N);
return 0;
}