插入排序
一、思想-决定高度
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);
}