在开始编写文章前,有几个问题需要思考一下:
- 什么是选择排序算法?
- 如何实现选择排序算法?
- 选择排序算法的时间复杂度
1. 什么是选择排序算法?
一种最简单的排序算法是这样的:
- 找出数组最小的元素,将它和数组的第一个元素互换;
- 在剩下的元素中找到最小的元素,将它和数组的第二个元素互换;
- 重复执行,直到将整个数组排序。
2. 如何实现选择排序算法?
/*
* 匹配函数
*/
public static boolean less(Comparable a, Comparable b)
{
return a.compareTo(b) < 0;
}
/*
* 交换函数
*/
public static void exch(Comparable[] a, int i, int j)
{
Comparable t = a[i]; a[i] = a[j]; a[j] = t;
}
/*
* 排序算法
*/
public void sort(Comparable[] a)
{
//将a[]按升序排序
int N = a.length;
for(int i = 0; i < N; i++)
{ //将a[i]和a[i+1,...,N]中最小的元素交换
int min = i;
for(int j = i+1; j < N; j++)
{
if(less(a[min],a[j])) min = j;
}
exch(a, i, min);
}
}
实现流程图:
3. 排序算法的复杂度
选择排序算法是最初级的排序算法,它的交换次数:N,比较次数:1 + 2 + 3 + ... + (N - 1) = N(N-1)/2 ~ N*N/2。选择排序不断的选择剩余元素的最小者。
运行时间与输入无关。无论是一个有序数组、主键全部相等的数组还是随机数组他们的排序时间一样长。
数据移动是最少的。每次交换都会改变两个数组元素的值,选择排序只用了N次交换。