选择排序
- 找到数组中最小的元素
- 将它和数组的第一个元素交换位置
- 在剩下的元素中找到最小的元素, 将它与数组的第二个元素交换位置
- 如此往复, 直至将数组排序
快速排序算法实现
public class Selection {
public static void sort(Comparable[] a) {
int N = a.length;
for (int i = 0; i < N; i++){
int min = i;
for (int j = i+1; j < N; j++){
if (less(a[j], a[min])) {
min = j;
}
}
exch(a, i, min);
}
}
}
分析上述代码块(C-1)
- 不难看出, 核心算法是两层for循环组成, 我们从内到外分析
- 内循环只是在比较当前元素与目前已知的最小元素
- 内循环执行完成, 会将比较的最小元素的索引给min
- 内循环外面执行exch, 将外循环的索引i和当前的最小索引min进行交换
- 也就是说, 外循环执行几次, exch交换函数就执行几次,我们假定为N次
- 那么决定算法的时间效率就是内循环每次执行相互比较的次数
- 通过查看代码我们发现,每次比较的次数是有规律可循的,第一次是(N-1)次交换, 第二次是(N-2)次交换, 第三次是(N-3)次交换,直至2, 1次
- 回头看第四步,一共交换了N次以及(N-1)+(N-2)+…+2+1 = N(N-1)/2 ~ N*N/2次比较
- 友情提示: N(N-1)/2 ~ N*N/2 在算法中固定的时间可以忽略掉,算法运行时间随着变量的增减而变化.
选择排序的特点
1. 运行时间和输入无关, 数组长度相等, 运行时间相等,
不会因为一个数组已经排好顺序而时间减少, 这也是选择排序的缺点.
2. 数据移动是最少的, 交换的次数N和数组的大小是呈线性关系,
其他算法都不具备这个特征(大部分算法的移动次数都是线性对数或是平方级的)