一.概述
1.插入排序: 每一趟,将待排序的序列记录,根据待排序关键字大小插入到有序队列合适位置当中,直到所有数列按照大小要求完成。
2.直接插入排序:最简单的一种插入排序,每次将待排序的的数字直接插入到整个序列的合适位置当中。
二.算法思想
将第 i个记录插入到前面 i-1(此处设位 j )个已排序的记录中 的记录中 ,将 i 记录的关键字 temp,顺次与前面 ,已经记录的关键字比 较,所有比 temp大的依次向后移动一个位置,直到遇比 temp小的或相等的数字,插入到后面。
假设有一组无序序列 R0, R1, … , RN-1。
(1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。
(2) 然后,我们要依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。
(3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。
示例:一组无序数据 例: 3,7,2,8,5,6
设置一个 下标 i , 一个下标 j ,一个变量 temp 用来存储当待比较的数据
初始 i = 0 ; i从0号元素开始
j = i -1 ; j 从 i的前一个元素开始
三.时间复杂度和空间复杂度
当数据为正序时,时间复杂度最低,为O(n),
当数据为逆序时,之间复杂度最高,为O(n^2);
所以,数据越接近正序,算法性能越好。
由于在交换数据时,需要一个临时变量,所以空间复杂度为 O(1);
由于在排序时,不需要改变相等元素的位置,所以直接插入排序是一种稳定的算法。
四.代码
/*
Date:2018/12/27
From:mohican
*/
#include<stdio.h>
//直接插入排序
//类似于扑克牌 接牌的过程 与选择排序有点类似
//设置一个tmp 把 当前i 的值 放在tmp里面,每个数据和tmp进行比较,如果是降序
// pcur > tmp ==> pcur -->赋给 tmp ,再把 i+1的值赋给 pcur ; j-- ,继续和tmp进行比较
void InsertSort(int *arr,int len)
{
int temp = 0;
int j =0;
for(int i =0;i<len;++i)
{
int temp = arr[i];
for( j = i-1;j>=0;--j)
{
if(arr[j] >temp)
{
arr[j+1] = arr[j];
}
else
{
break;
}
}
arr[j+1] = temp;
}
}
void show(int *arr,int len)
{
for(int i =0;i<len;++i)
{
printf("%d\t",arr[i]);
}
}
int main()
{
int arr[]={7,3,4,6,4,2.876,3,53,346};
int len = sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,len);
show(arr,len);
getchar();
return 0;
}