基本思想及图例说明
- 冒泡排序是通过不断地将相邻的两个数进行比较,来达到排序的目的。
- 选择排序则是不断地遍历所有元素,找到最小(最大)的放在首位。
下面看图例:
初始序列: 5 2 4 6 1 3
第一次遍历找到最小的数 1 ,将他和首位元素 5 交换。
第一趟:1 2 4 6 5 3
第二次遍历除首位外的数,将最小的数 2 和第二位元素交换,但是 2 已经在第二位所以位置不变。
第二趟:1 2 4 6 5 3
第三次遍历除第一位和第二位的元素,将最小的数 3 和第三位元素交换。
第三趟:1 2 3 6 5 4
以此类推……
算法实现
对于具有 N 个元素的数组 arr[ N ]:
第 1 趟,在待排序数组元素 arr[ 1 ] ~ arr[ N ] 中选出最小的元素,将它与 arr[ 1 ] 交换;
第 2 趟,在待排序数组元素 arr[ 2 ] ~ arr[ N ] 中选出最小的元素,将它与 arr[ 2 ] 交换;
以此类推,第 i 趟在待排序数组元素 arr[ i ] ~ arr[ N ]中选出最小的元素,将它与 arr[ i ] 交换,使有序序列不断增长直到全部排序完毕。
代码:
#include<stdio.h>
int main()
{
int p, temp;// p 用来标记最小元素的位置
int a[8] = {6, 5, 3, 1, 8, 7, 2, 4};
// i < 7 是因为要前后进行比对,如果 i 为最后一位时就没有与后面元素比对的必要
for(int i = 0; i < 7; i ++)
{
//默认最小元素位于首位
p = i;
//遍历 i 后所有的元素,找到最小的元素位置
for(int j = i + 1; j < 8; j ++)
{
//如果有比首位元素更小的元素用 p 记录它的位置
//将大于改成小于可达到从大到小的排序目的
if(a[p] > a[j])
{
p = j;
}
}
//将最小的元素和首位交换
temp = a[i];
a[i] = a[p];
a[p] = temp;
}
for(int i = 0; i < 8; i ++)
{
printf("%d ", a[i]);
}
return 0;
}