插入排序

来源:互联网 发布:京东物流java笔试题 编辑:程序博客网 时间:2024/06/06 09:48
算法导论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;
}
0 0