直接插入排序

思想:(见图)


方法一:

直接上代码:

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加一是因为上边多减得一个
	}
}




原文地址:https://www.cnblogs.com/melons/p/5791867.html