插入排序的基本思想是:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止
插入排序的步骤:
将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2, ....,1)的关键字比较:
- 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置
- 若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j + 1即为R[i]插入位置
C语言实现
/*
<span style="white-space:pre"> </span>功能:将p[n]插入到 p[0]到p[n-1] 当中
<span style="white-space:pre"> </span>参数p是数组,且前p[0]到p[n-1]是已经排好顺序的,
<span style="white-space:pre"> </span>参数n是要插入的数的下标
*/
void insert(int *p, int n)
{
int key = p[n];//要插入的数
int i = n-1;
while(i>=0)//循环遍历p[i]到p[0],找到要插入的位置
{
if(p[i]>key)//如果p[i]大于要插入的数,那么将p[i]向后移动一位
{
p[i+1]=p[i];
i--;
}
else{ //因为前面是有序的,所以不用再比较了
break;
}
}
p[i+1] = key; // 插入结果
}
/*非递归实现*/
void Insert_Sort(int* arr, int len)
{
<span style="white-space:pre"> </span>for(int i = 1; i<len; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>insert(arr,i);
<span style="white-space:pre"> </span>}
}
/*递归实现
功能:将arr数组中的,n+1个数排序
参数arr:数组
参数n:指示要排序的下标范围,0-n
*/
void recursive_Insert_Sort(int *arr, int n)
{
<span style="white-space:pre"> </span>if(n>0)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>recursive_Insert_Sort(arr, n-1); //第一步将前n-1个排好顺序
<span style="white-space:pre"> </span>insert(arr, n);//第二步将arr[n]插入到前n-1个数中
<span style="white-space:pre"> </span>}
}
int main(int argc, char* argv[])
{
<span style="white-space:pre"> </span>int arr[10] = {2,1,4,3,6,7,8,6,5,4};
<span style="white-space:pre"> </span>Insert_Sort(arr, 10);
<span style="white-space:pre"> </span>recursive_Insert_Sort(arr, 9);
<span style="white-space:pre"> </span>for(int i=0; i<10; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>printf("%d ", arr[i]);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("\n");
<span style="white-space:pre"> </span>return 0;
}
python实现
def Insert_Sort(arr):
arr_len = len(arr)
for i in range(1,arr_len):
temp = arr[i]
index = 0
for j in range(0, i)[::-1]:
if arr[j]>temp:
arr[j+1] = arr[j]
arr[j] = temp
else:
break
if __name__ =="__main__":
arr = [4,3,3,1,2];
Insert_Sort(arr);
print arr;
时间复杂度
当数组和要求排序的顺序相同时,为o(n)
当数组和要求排序的顺序相反时,为o(a(n *n)+b*n+c),a、b、c为常量
平均时间复杂度为o(n * n)