2024年9月27日学习了数组排序法中的冒泡排序法和插入排序法。实现代码如下所示:
//成绩公布单
//输入12名同学每个人的总成绩,输出由高到低排序后的成绩
int main()
{
int i = 0;
int a[5] = { 0 };
//int j = 0;
int iTemp = 0;
int iPos = 0;
printf("请输入成绩:\n");
for (i = 0; i < 5; i++)
{
printf("a[%d] = ",i);
scanf("%d", &a[i]);
}
//冒泡排序法
//for (i = 1; i < 5; i++)
//{
// for (j = 4; j >=i; j--)
// {
// if (a[j] > a[j - 1])
// {
// iTemp = a[j-1];
// a[j - 1] = a[j];
// a[j] = iTemp;
// }
// }
//}
//拆入排序法
for (i = 1; i < 5; i++)
{
iTemp = a[i];
iPos = i - 1;
while ((iPos >= 0) && (a[iPos] < iTemp))
{
a[iPos+1] = a[iPos];
iPos--;
}
a[iPos+1] = iTemp;
}
for (i = 0; i < 5; i++)
{
printf("%d\t", a[i]);
if (i == 3)
{
printf("\n");
}
}
return 0;
}
冒泡排序法
冒泡排序法
for (i = 1; i < 5; i++)
{
for (j = 4; j >=i; j--)
{
if (a[j] > a[j - 1])
{
iTemp = a[j-1];
a[j - 1] = a[j];
a[j] = iTemp;
}
}
}
下面我说一下我对这段代码的理解,当i=1时,进行第一轮的冒泡排序,从最后一个数组元素a[4]开始依次向前进行比较,如果遇到前面元素小于自身则互换两个元素位置,否则不变。第一轮交换完之后,第一个元素为该数组所有元素最大值,即a[0]=MAX。所以第二轮i++,只用比较剩余i-1个元素即可,比较方法同第一轮相同,后一个元素如果比前一个元素大,则两元素位置互换,否则不变,第二轮变完后前两个顺序就排完了,依次类推。
插入排序法
for (i = 1; i < 5; i++)
{
iTemp = a[i]; //设置插入值
iPos = i - 1; //插入值前一个位
while ((iPos >= 0) && (a[iPos] < iTemp)) //插入值前一个值小于插入值
{
a[iPos+1] = a[iPos]; //前一个元素后移腾出位置
iPos--; //继续与前一个值比较
}
a[iPos+1] = iTemp; //不满足while条件时,即要么iPos<0,要么a[iPos]>iTemp 赋值
//把腾出的位置给iTemp
}
关于我对插入排序法的理解是这样子的,当i=1时,将i=1存储起来给iTemp赋值,然后拿iTemp与a[0]进行比较,如果a[0]<iTemp则将a[0]的值赋给a[1],iPos--,此时iPos为-1小于0所有不满足循环条件,直接退出循环,将iTemp的值赋值给a[0]完成第一轮排序,接下来都是这种排序方式。再以i=3时为例吧,先将a[3]元素的值赋给iTemp,然后与前一个元素值进行比较,如果前一个元素比iTemp的值小则a[2]元素的值赋给a[3]就像往后移动了一格一样,iPos减1此时iPos=1,接下来继续向前进行比较如果此时a[1]的值大于iTemp则循环结束,跳出循环体,然后将iTemp的值赋给a[2],完成排序。
以上就是我对冒泡排序和插入排序的理解,如果有误请各位老师批评指正,谢谢。