插入排序

算法导论PDF:10(15 / 758)
插入排序(就地排序):
思路:
(1)for  j <--2 to length[A]
(2)     do  key <-- A[j]
(3)         i <-- j - 1
(4)         while  i > 0 and A[i] > key //比较
(5) do  A[i + 1] <-- A[i] //右移
(6)    i <-- i - 1
(7) A[i + 1] <-- key
分析:
    下标j指示了待插入到手中的“当前牌”。
    length[A]代表数组A中元素的个数。
    在外层for循环(循环变量为j)的每一轮迭代的开始,包含元素A[1 .. j - 1]的子数组构成了左手中当前已排好序的一手牌,元素A[j + 1 .. n]对应于仍然在桌上的那堆牌。
    实际上, 元素A[1 .. j - 1]是最初在位置1 到 j - 1上的那些元素,但现在已经排好序了。
    在外层for循环的循环体中, 要将A[j - 1]、A[j - 2]、A[j - 3]等元素向右移一个位置,直到找到A[j]的适当位置时为止(第4 - 6行),这时将A[j]的值插入(第7行)。
时间复杂度:n^2.
*************************************************************************************
void insert_sort(int A[])
{
for(int j = 2; j <= A[0]; j++)
{
int key = A[j];
int i = j - 1;
while(i > 0 && A[i] > key)//比较
{
A[i + 1] = A[i];//右移
i = i - 1;
}
A[i + 1] = key;
}
}
**************************************************************************************
示例程序:
#include<stdio.h>
int main(void)
{
int A[7] = {6, 5, 2, 4, 6, 1, 3};
int length = A[0];
printf("length = %d\n", length);
for(int j = 2; j <= length; j++)
{
int key = A[j];
int i = j - 1;
while(i > 0 && A[i] > key)//比较
{
A[i + 1] = A[i];//右移
i = i - 1;
}
A[i + 1] = key;//插入
}
for(int i = 1; i <= length; i++)
{
printf("%d\t", A[i]);
}
printf("\n");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值