在之前的文章中我说了说我所理解的冒泡排序算法和选择排序算法,刚开始学完之后孩子着实是有些迷茫,觉得两个东西好像一模一样。下面就结合之前的讲解来谈谈我所认为的相同与不同。
我们来看一下之前在冒泡排序算法中的讲解示范:
将下列降序数组数组倒序输出
a[0] | a[1] | a[2] | a[3] | a[4] |
8 | 6 | 4 | 2 | 0 |
首先来看一看冒泡排序的图解:
第一回合:
第二回合:
第三回合:
第四回合:
(用的之前的图,水印有重合请见谅)
代码:
#include <stdio.h>
#define N 5
int main()
{
int a[N]={8,6,4,2,0};
int i,j,temp;
//冒泡排序
for(j=0;j<N-1;j++)
{for(i=0;i<N-1-j;i++)
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}}
//输出结果
printf("\nThe sorted array\n");
for(i=0;i<N;i++)
printf("%3d",a[i]);
}
接下来我们看看选择排序的图解:
代码:
#include <stdio.h>
#define N 5
int main()
{
int a[N]={8,6,4,2,0};
int i,j,temp,k;
//选择排序
for(j=0;j<N-1;j++)
{k=j;
for(i=j+1;i<N;i++)
{if(a[i]<a[j]) k=i;
temp=a[k];
a[k]=a[j];
a[j]=temp;}}
//输出结果
printf("\nThe sorted array:\n");
for(i=0;i<N;i++)
printf("%3d",a[i]);
}
总结:由上面的图解和代码可以看出两者既有相同又有不同。
相同点:
思路上都是分成几个轮次,在每一轮中比较出最值并调换至指定位置;
形式上都是双重循环的嵌套,并且最外层循环的表达形式一样(比较轮次是一样的)。
不同点:
冒泡排序算法在一轮的比较中,只要遇到符合条件(即前一个数据大于(或小于)后面的数据)就会将两个数据的位置进行调换,直至最后一轮中比较只有一次,相邻两数之间的比较比较强;选择排序算法则是在每一轮的比较中仅将数组的下标记录下来,在一轮的比较结束后在进行数据的调换,选择性比较比较强。
同时也正是因为每一轮中比较的时候选择排序只需要记录下标而不需要进行数据的调换使得选择排序的交换次数要少于冒泡排序,预算效率也更高(在处理大量数据的时候比较明显数据太少并不能看出来),也相对比较更简单一些。
该小试牛刀一下了,再来一道题,判断一下哪个是哪个吧。
问题:将数组a[10]={25,40,12,15,32,75,45,68,18,42}按从小到大的顺序输出。
代码一:
#include <stdio.h>
#define N 10
int main()
{
int a[N]={25,40,12,15,32,75,45,68,18,42};
int i,j,temp;
for(j=0;j<N-1;j++)
{for(i=0;i<N-1-j;i++)
if(a[i]>a[i+1])
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}}
//Êä³ö½á¹û
printf("The sorted array:\n");
for(i=0;i<N;i++)
printf("%3d",a[i]);
}
代码二:
#include <stdio.h>
#define N 10
int main()
{
int a[N]={25,40,12,15,32,75,45,68,18,42};
int i,j,k,temp;
for(i=0;i<N-1;i++)
{k=i;
for(j=i+1;j<N;j++)
if(a[j]<a[k]) k=j;
temp=a[k];
a[k]=a[i];
a[i]=temp;}
printf("The sorted array:\n");
for(i=0;i<N;i++)
printf("%3d ",a[i]);
return 0;
}
答案在评论区哦!!!
希望我的总结对您有些许帮助,看到这里就给孩子点个赞吧^-^!