选择排序是什么?:
选择排序(Selection sort):
是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法
可以将数组分为两个部分,有序和无序。刚开始有序为空。每次从无序的队列中选出最小(最大)的数放在有序的队尾。
如下图:
总共需要比较n-1
次
第一次选出5,放在第一个。
第二次选出8,放在有序的队尾。
······
为什么说选择排序是不稳定的呢?
稳定性:(来自百度百科)
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
举个例子,序列arr = [5 8 5 2 9],我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。
最后附上代码:
//比较n-1次
for (int i = 0;i<arr.length-1;i++){
//定义两个变量,一个用来存储最小值,一个用来存储最小值的索引
//先将无序队列的第一个元素赋给这两个变量
int minIndex = i;
int min= arr[i];
//比较无序队列的每个元素
for (int j = i+1; j<arr.length;j++){
if (min > arr[j]){
//将最小值赋给变量
minIndex = j ;
min =arr[j];
}
}
//当循环遍历完成后,如果最小值的索引不是无序队列的第一个元素,就将其和最小值进行交换
if (minIndex!=i){
arr[minIndex] = arr[i];
arr[i] = min;
}
}