什么是插入排序

插入排序

一、思想-决定高度

1、插入排序,就像玩扑克牌一样,按照玩法规则(顺子),拿到一张牌,将其插入到已经理好的牌中。
2、插入排序算法的思想就是:维护一个有序区,把元素一个一个插入到有序区的适当位置,直到所有的数据元素有序位置。

二、算法步骤(从小到大排序)

1、给定无序数据(数组);
2、把数组的首元素作为有序区,此时有序区只有一个元素;
3、第一轮,有序区有且只有一个元素,将第二个元素取出作为待插入数据,同有序区第一个元素比较,若第一个元素大,将其移到后一个元素的位置,然后将待插入数据放到第一个元素的位置;若有序区第一个元素小,则位置不变;
4、第二轮,有序区变为两个元素,此时将第三个元素取出作为待插入数据,然后同有序区数据进行比较;比较规则:从有序区最后一个数据开始比较,若有序区数据大,则将其向后移动一个,然后依次在有序区从后往前取数据,与待插入数据进行比较,若有序区数据大,则依次向后移动;若待插入数据大,则直接插入待插入数据;
5、第三轮,有序区变为三个元素,此时将第四个元素取出作为待插入数据,然后同有序区数据进行比较;比较规则:从有序区最后一个数据开始比较,若有序区数据大,则将其向后移动一个,然后依次在有序区从后往前取数据,与待插入数据进行比较,若有序区数据大,则依次向后移动;若待插入数据大,则直接插入待插入数据。
6、第四轮…;
7、同理,进行插入操作,直至待插入数据全部插入,此时,排序完成。

三、代码

void My_InsertSort(char *pArray, int ArrayLen)
{
    
    
	int iFor = 0;//插入次数循环变量
	int jFor = 0;//有序区数据个数

	char temp = 0;
	
	for(iFor = 1; iFor < ArrayLen; iFor++)
	{
    
    
		//先记录待插入数据
		temp = pArray[iFor];
		//记录有序区数据个数
		jFor = iFor;
		for( ; jFor > 0; jFor--)
		{
    
    
			if(pArray[jFor-1] > temp)
			{
    
    
				//大于待插入数据,则向后移动
				pArray[jFor] = pArray[jFor-1];
			}
			else
			{
    
    
				//小于待插入数据,则找到位置,等待插入
				break;
			}
		}
		//插入数据
		pArray[jFor] = temp;
	}
	
	return;
}

int main(char argc,char *argv[])
{
    
    
	char Array[20] = {
    
    0};

	memset(Array, 0, sizeof(Array));
	memcpy(Array, "afbzynmdc", 9);
	printf("before : [%s]\r\n", Array);
	My_InsertSort(Array, 9);
	printf("after : [%s]\r\n", Array);

	memset(Array, 0, sizeof(Array));
	memcpy(Array, "213456789", 9);
	printf("before : [%s]\r\n", Array);
	My_InsertSort(Array, 9);
	printf("after : [%s]\r\n", Array);

    return (0);
}

猜你喜欢

转载自blog.csdn.net/weixin_46089486/article/details/103703796