选择排序法和冒泡排序法的比较

  • 格式:docx
  • 大小:15.85 KB
  • 文档页数:3

## 总结 ##
冒泡排序法是两两依次比较,并做交换,交换的次数多。
选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少。
相同点:
1.都要通过n-1组排出具有n个数的顺序;(n个数,n-1组排序)
2.都是通过逐个相比,比出最值的;
不同点:
1.冒泡法,顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其
他的值交换;
而选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值的
地方;

冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较
**(`arr[n],arr[n+1]`),如果前面的数大于后面的数(`arr[n] > arr[n+1]`),那么交换两个元素的
位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置
(arr[n-1])。
先一起再来看看冒泡排序法是怎么排序的。
数组排序前 7 23 12 4 33 21 2 17 13 9
第一轮排序 7 12 4 23 21 2 17 13 9 33
第二轮排序 7 4 12 21 2 17 13 9 23
第三轮排序 4 7 12 2 17 13 9 21
第四轮排序 4 7 2 12 13 9 17
第五轮排序 4 2 7 12 9 13
第六轮排序 2 4 7 9 12
第七轮排序 2 4 7 9
第八轮排序 2 4 7
第九轮排序 2 4
可以看到,每一轮的排序,在这一轮中参与比较的元素中最大的数将会浮到最后。而冒泡排
序的名字也是从这里来的。
void bubblesort(int a[], int m)
{
int i,j;
int tmp;
int flag = 0; //设定标志,如果第一次循环比较时没有发生交换,则说明数组是升
序排序,不用排序,提前结束循环。
for(i = 0; i < m; i++) //外层循环控制循环次数
{
for(j = 0; j < m-1-i; j++) //内层循环控制每次循环里比较的次数。
{
if(a[j] > a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 1;
}
}

if(0 == flag)
{
printf("No Sort\n");
break;
}
}
}
在选择排序法中说的就是,每一次循环过程中,通过比较选择出你需要的**最值**。选择
排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面
的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下
标)。
先来看看选择排序的过程:
数组排序前 7 23 12 4 33 21 2 17 13 9
第一轮循环 2 23 12 4 33 21 7 17 13 9
第二轮循环 4 12 23 33 21 7 17 13 9
第三轮循环 7 23 33 21 12 17 13 9
第四轮循环 9 33 21 12 17 13 23
第五轮循环 12 21 33 17 13 23
第六轮循环 13 33 17 21 23
第七轮循环 17 33 21 23
第八轮循环 21 33 22
第九轮循环 22 33
通过这个过程,我们可以看到,每轮循环过程中,都会找出这个最值元素,下一轮排序时
就不用再考虑这个元素了。
void selectionsort(int a[],int m)
{
int i,j;
int k;
int tmp;

for(i = 0; i < m-1; i++)//控制循环次数,n个数需要n-1次循环
{
k = i;
for(j = i+1; j < m ; j++)
{
if(a[j] < a[k])
k = j;
}
//i不等于k是就证明a[i]不是最小的,
//i等于k时证明a[i]就是本轮比较过程中最小的值
if(i != k)
{
tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}
}
}