插入排序

插入排序:

版本一:

#include <stdio.h>

//实现元素数为7的整型数组的元素由小到大排列
void Insertion_Sort(int A[])
{
for (int j = 1; j < 7; j++)
{
int key = A[j];
int i = j - 1;
while (i >= 0)
{
if (A[i] > key)
{
A[i + 1] = A[i];
i--;
}
}
A[i + 1] = key;
}
for (int i = 0; i < 7; i++)
{
printf("%d\n", A[i]);
}
}
void main()
{
int A[] = { 2, 3, 5, 6, 1, 7, 9 };
Insertion_Sort(A);
}

但是结果是输出不了结果,然后使用visual studio上面的debug功能,发现程序始终没用进入if程序段里面,才发现原来是由于2>3不成立,所以程序始终没有进入if语句段,所以导致i--无法执行,出现死循环。

经过改正,将程序修改如下:

#include <stdio.h>

//实现元素数为7的整型数组的元素由小到大排列
void Insertion_Sort(int A[])
{
for (int j = 1; j < 7; j++)
{
int key = A[j];
int i = j - 1;
while (i >= 0)
{
if (A[i] > key)
A[i + 1] = A[i];
i--;
}
A[i + 1] = key;
}
for (int i = 0; i < 7; i++)
{
printf("%d\n", A[i]);
}
}
void main()
{
int A[] = { 3, 2, 5, 6, 1, 7, 9 };
Insertion_Sort(A);
}

结果输出的结果为:9,6,3,5,6,7,9,发现没有实现程序由小到大的排序功能。经过分析,是因为即使当A[i]<=key时,i--依旧执行,所以与本意不符合。

然后将程序改为:

#include <stdio.h>
void Insertion_Sort(int A[])
{
for (int j = 1; j < 7; j++)
{
int key = A[j];
int i = j - 1;
while ((i >= 0) && (A[i]>key))
{


A[i + 1] = A[i];
i--;

}
A[i + 1] = key;
}
for (int i = 0; i < 7; i++)
{
printf("%d\n", A[i]);
}
}
void main()
{
int A[] = { 3, 2, 5, 6, 1, 7, 9 };
Insertion_Sort(A);
}

然后就能得到正确的结果。

事实证明,理解了算法的思想与成功实现之间还是存在一定距离的,需要不断地练习才能避免一些比较浅显的错误。

原文地址:https://www.cnblogs.com/qifengle/p/4921313.html