选择排序
因为它在不断地选择剩余元素中的最小值
,故称为选择排序
首先找到数组中最小的那个元素,其次将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
//选择排序,将a[]按升序排列
public void quickSort(int[] a){
for (int i = 0; i < a.length; i++) {
int min = i; //最小元素的索引
for (int j = i + 1; j < a.length; j++) { //注意:是从j=i+1开始,不是j=i!!因为初始时i=min,所以i处无需再比较
min = (a[j] < a[min]) ? j : min;
}
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
对于长度为N的数组,选择排序需要大约
N2/2
N
2
/
2
次比较和
N
N
次交换
每次交换都能排定一个元素,因此交换总次数是N。
0到 N-1 的任意 i 都会进行1
次交换和N-1-i
次比较,因此共有N 次交换
以及 (N-1)+(N-2)+…+2+1 =N(N-1)/2 次比较
~
选择排序具有两个很鲜明的特点:
1、 运行时间和输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么。一个已经有序的数组和一个元素随机排列的数组所用的排序时间竟然一样长!2、 数据移动是最少的。选择排序用了N次交换——交换次数与数组大小是线性关系。(其他排序算法大多为线性对数或平方级别)