首页 > 代码库 > 插入法排序

插入法排序

    所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。

    假设我们输入的是 “5,1,4,2,3” 我们从第二个数字开始,这个数字是1,我们的任务只要看看1有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较1和5,1比5小,所以我们就交换1和5,原来的排列就变成了“1,5,4,2,3 ”

    接下来,我们看第3个数字有没有在正确的位置。这个数字是4,它的左边数字是5,4比5小,所以我们将4和5交换,排列变成了 “1,4,5,2,3 "我们必须继续看4有没有在正确的位置,4的左边是1,1比4小,4就维持不动了。

/********************************************************************** 
 *功能描述:插入法排序 
 *输入参数: 数组, 起始索引(0), 终止索引
 *输出参数: 排好序的数组
 *返回值: void
 *其它说明: 
 *修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等 
 *修改日期        版本号              修改人         修改内容 
 * -------------------------------------------------------------------------------------------------- 
 * 20140716         V1.0              wuyq            创建 
 ***********************************************************************/ 
void insertion_sort(int array[], int first, int last)
{
	int i,j;
	int temp;
	for(i=first+1; i<=last; i++)
	{
		temp=array[i];
		j=i-1;
		//与已排序的数逐一比较,大于temp时,该数移后
		while((j>=first)&&(array[j]>temp))
		{
			array[j+1]=array[j];
			j--;
		}
		array[j+1]=temp;
	}
}
/********************************************************************** 
 *功能描述:插入法排序 
 *输入参数: 数组, 元素个数
 *输出参数: 排好序的数组
 *返回值: void
 *其它说明: 
 *修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等 
 *修改日期        版本号              修改人         修改内容 
 * -------------------------------------------------------------------------------------------------- 
 * 20140716         V1.0              wuyq            创建 
 ***********************************************************************/ 
void insert_sort(int* array, unsigned int n)
{
	int i,j;
	int temp;
	for(i=1;i<n;i++)
	{
		temp=*(array+i);
		for(j=i;j>0&&*(array+j-1)>temp;j--)
		{
			*(array+j)=*(array+j-1);
		}
		*(array+j)=temp;
	}
}

#include <stdio.h>

int main()
{
	int a[8] = {5, 6, 2, 7, 2, 0, 1, 4};
	//insertion_sort(a, 0, 7);
	insert_sort(a, 8);
	int i;
	for(i=0; i<8; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	
	return 0;
}