两种排序是最常见的简单排序算法。
选择排序
其特点有:
- 运行时间和输入无关
- 数据移动最少
关键代码:
public static void sort(Comparable[] a)
{ // 将数组a 按照从小到大排列
for (int i = 0, n = a.length; i < n; ++i){
// 首先找i到n之间的最小数
int min = i;
for (int j = i+1; j < n; ++j){
if (less(a[j],a[min]) ){
// 如果遇到更小的
min = j;
}
}
// 将i位置和最小数交换
exch(a,min,i);
}
}
插入排序
特点:
- 插入排序所需时间取决于输入中元素的初始顺序
- 对于部分有序数组,插入排序的性能很好
关键代码:
public static void sort(Comparable[] a)
{ // 将数组a 按照从小到大排列
int N = a.length; // 数组长度
for (int i = 0; i < N ; ++i){
for (int j = i; j > 0 && less(a[j] , a[j - 1]); --j){
// j 是从i 往 0 进行遍历
// 如果 a[j] 比 a[j - 1] 还要小, a[j] 应该和 a[j-1] 换位置
exch (a, j , j - 1);// 换位操作, 此处还可以提高效率
}
}
}
两种排序算法比较
打包代码地址:link
命令: java SortCompare InsertionX Selection 20000 100
, 其中:
- InsertionX 代表插入排序(优化过的版本)
- Selection 代表选择排序
- 20000 代表数组元素个数
- 100 代表排序次数
运行结果:
总的来说,插入排序在性能上比选择排序好一些。