选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
当使用选择排序时,可以看作是有一个无序区和一个有序区(即已经排好序的区域),刚开始所有的元素都位于无序区,第一次遍历找出所有元素中最小的元素,然后交换第一个元素和最小的元素的位置,此时有序区有一个最小元素,且位于第一个位置;第二遍开始遍历就从第二个元素开始,因为第一个元素已经是最小的了,第二次遍历再从无序区中找到最小的元素,然后和第二个位置的元素交换位置,此时有序区已经有两个元素;第三次遍历就从第三个元素开始遍历。。。。依次类推,经过n-1次遍历就可以把所有的元素排好序。下面用一个简单的例子来看看具体的操作:
例如有元素:2,3,1,5,4
第一次遍历从元素2开始,寻找最小的元素,最小的元素为1,交换1和2 的位置结果如下:
1,3,2,5,4
第二次遍历从元素3开始:找到最小的元素2,交换2和3的位置,结果如下:
1,2,3,5,4
第三次遍历从元素3开始:找到最小的元素3,已经在正确的位置上,不用交换,结果如下:
1,2,3,5,4
第四次遍历从元素5开始:找到元素4,交换4和5的位置,结果如下:
1,2,3,4,5
至此,经过4趟排序,所有元素已经有序。
下面来看一下具体的代码是如何实现的。
#include <iostream>
using namespace std;
int main()
{
int a[10] = {2,5,1,7,8,15,13,19,20,9};
cout << "元素初始顺序如下:\n";
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
for(int i = 0;i<9;i++)
{
int min = i;
for(int j = i+1;j<10;j++)
{
if(a[min]>a[j])
min = j;
}
int temp;
temp = a[i];
a[i] = a[min];
a[min] = temp;
cout << "第" << i << "趟排序结果如下:";
for(int k = 0;k<10;k++)
cout << a[k] << " ";
cout << endl;
}
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
运行代码,结果如下:
接下来来看一下该排序是否稳定,在分析排序是否稳定之前,先了解一下何为算法稳定?
(摘自百科)假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
接下来再来看一下一个例子:5,3,5,2,8
很显然在排序之前,第一个位置的5是在第三个位置的5之前的,
第一次遍历时:第一个位置的5会和元素2交换位置,此时排序结果是:
2,3,5,5,8
交换之后,第一个位置的5被换到了第四个位置上,即两个5的相对顺序被交换了,按照稳定性的定义,两个相同的元素在排序前后相对位置不改变才是稳定的,由此可见,选择排序不是稳定的排序。
感兴趣的朋友们可以关注我,一起学习c++吧!