选择排序
1.定义:
(1)找到数组中最小的那个元素
(2)将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)
(3)在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置
(4)如此以往,直到将整个数组排序
总结,不断地选择剩余元素之中的最小者,并放到剩余元素的第一个位置。
2.代码剖析:
假设:数组a,长度n,下标i
(1)这个算法每次都只替换一组数据
(2)通过定义2、3,我们可知,其是从下标1开始,一直运行到下标n
(3)当下标是 i (1 <= i <= n)时,因为a[i]之前元素肯定是不大于a[i]的,所以我们只需要找到a [i] 之后的元素中,小于a[i],且又在剩下的集合里是最小的元素。找到之后,与a[i]交换位置即可
3.图解:
我们可以看到,当最后整个数组都已经有序的情况下,算法还在运行,所以这就是此算法的缺陷之一吧,即前面的结果怎么样我不知道,我只知道我每次都要运行一遍,造成浪费。但优点是理解简单,越无序的数组,其展示的效能比越高。
4.按照这个思路,写出代码:
/**
* 选择排序
* 排序过程:
* 1.找到数组中最小的那个元素
* 2.将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)
* 3.在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置
* 4.如此往复,直到整个数组排序
*
* @param array
*/
public static void chooseSort(int[] array) {
int N = array.length;
int t;
for (int i = 0; i < N; i++) {
int min = i;
//循环遍历,获得最小的数所在的索引
for (int j = i + 1; j < N; j++) {
if (array[j] < array[min]) {
min = j;
}
}
//找到最小的数所在的索引之后,交换当前的数和最小的数
t = array[i];
array[i] = array[min];
array[min] = t;
}
}
5.算法优劣分析:
(1)对于长度为N的数组,选择排序需要大约N*N/2次比较和N次交换
(2)运行时间和输入无关。即每一次要找到最小的元素时,都需要重新循环一遍数组,而不能利用到上一次扫描的结果。因此,可以发现,当一个已经有序的数组或者是元素值都相等的数组和一个元素随机的数组进行选择排序时,它们消耗的时间是一样的。
(3)数据移动量最小。选择排序只用了N次交换,其交换次数和数组的大小成线性关系。应该说是其他排序算法里,数据移动最小的。
6.资料引用:
《算法Algorithms(第4版)》 p155~p156
下一节:Java算法(2):插入排序