您的位置:首页 > 其它

直接插入排序

2017-03-24 21:08 197 查看

直接插入排序

​ 直接插入排序顾名思义,就是通过将还未进行排序的元素插入到有序序列中进行排序的来使得无序序列有序算法。

​ 直接插入排序的算法执行步骤为:

1、查找出L[i]在L[1]…L[i - 1]的插入位置K

2、将L[K]…L[i - 1]的所有元素向后移动一位

3、将L[i]插入到L[K]处

示意图



相关代码

/**
*  直接插入排序算法(L为线性表)
*  1、查找出L[i]在L[1]...L[i - 1]的插入位置K
*  2、将L[K]...L[i - 1]的所有元素向后移动一位
*  3、将L[i]插入到L[K]处
*/

typedef int type;
void print_array(type *L, int len, char *msg);
/**
*  用于交换元素
*/
void swap(type *a, type *b)
{
type tmp = *a;
*a = *b;
*b = tmp;
}
/**
*  L   为type类型的可进行大小对比的线性顺序表
*  len 为线性顺序表的长度
*/
void insert_sort(type* L, int len)
{
int key = 0;                    //哨兵
int i = 0,j;
for(i = 1;i < len;i ++)
{
key = L[i];
for(j = i - 1;j >= 0 && L[j] > key; j --)
{
L[j + 1] = L[j];        //将元素向后移动
}

L[j + 1] = key;
print_array(L, ARRAY_SIZE, "排序中:");
}
}


效率

空间复杂度:仅仅使用了一个哨兵,因此空间复杂度为O(1)。

时间复杂度:

​ 最好时间复杂度:原序列已经有序不需进行交换元素但是比较操作同样进行因此时间复杂度为O(n);

​ 最坏时间复杂度:原序列恰好为预期序列的逆序,总的比较次数为2+…+i,交换次数为2+…+(i + 1)。

​ 平均时间复杂度:去最好与最坏的平均值,因此移动次数约为n*n/4;

​ 直接插入排序的时间复杂度为O(n*n);

稳定性:直接插入排序是稳定的排序算法

适用性:直接插入排序适用于顺序线性表和顺序链表的排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 插入排序