思想:(见图)
方法一:
直接上代码:
void InsertSort(int *a,int size)
{
assert(a);
int i, j, tmp;
for (i = 0; i < size-1; ++i)
{
tmp = a[i + 1];
for (j = i; j >= 0; --j) //在有序序列中插入后来数
{
if (a[j] > tmp)
{
a[j+1] = a[j];
}
else
{
break;
}
}
a[j+1] = tmp;//原来时上边的J最后又减了一个
}
}
方法二:
其实是一个有问题的程序,因为出现数组下标是负数了,源于功能能实现,所以摆放于此
//很可笑的一个问题
void InsertSort(int *a,int size)
{
assert(a);
int i, j, tmp;
for (i = 0; i < size-1; ++i)
{
tmp = a[i + 1];
for (j = i; j >= -1; --j)
{
if (a[j] > tmp) //[j] j尽然成负数了
{
a[j+1] = a[j];
}
else
{
a[j + 1] = tmp;
break;
}
}
}
}
方法三:
//下面就是对的
void InsertSort(int a[], int len)
{
int i, j, temp;
for (i = 1; i<len; i++)
{
if (a[i]<a[i - 1])
{
temp = a[i];
for (j = i - 1; a[j]>temp; j--)
a[j + 1] = a[j];
a[j + 1] = temp;
}
}
}
方法四:
end为有序序列最后一个元素下标
void InsertSort(int *a, int size)
{
assert(a);
for (int i = 1; i < size; ++i)
{
int index = i;
int tmp = a[index];
int end = index - 1;
while (end >= 0 && tmp < a[end])
{
a[end + 1] = a[end];
--end;
}
a[end + 1] = tmp; //这里end加一是因为上边多减得一个
}
}