Java基础算法(1)——选择排序
1.建立排序基类
为了方便以后专心写排序的逻辑,于是将一些经常重复使用的方法抽离出来,此处参考《算法》第四版一书。
方法简介:
- sort(Comparable[] a) 排序传入的数组
- less(Comparable v,Comparable w) 比较v,w的值,若v<w 返回boolean类型
- exch(Comparable[] a,int i,int j) 交换数组a中下标为i,j两者的值
- show(Comparable[] a) 控制台输出此数组
- isSorted(Comparable[] a) 判断数组是否已经排序完成 返回boolean类型
package Algorithm.Sort;
/**
* 排序算法类的模板2
* 为了方便测试,具体排序类继承此类即可
*
* 方法简介:
* sort(Comparable[] a) 排序传入的数组
* less(Comparable v,Comparable w) 比较v,w的值,若v<w 返回boolean类型
* exch(Comparable[] a,int i,int j) 交换数组a中下标为i,j两者的值
* show(Comparable[] a) 控制台输出此数组
* isSorted(Comparable[] a) 判断数组是否已经排序完成 返回boolean类型
*/
public class Template {
public static void sort(Comparable[] a){
}
/**
* 比较v,w的值,若v<=w 返回true,否则返回false
* @param v
* @param w
* @return
*/
public static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<=0;
}
/**
* 交换数组a中下标为i,j两者的值
* @param a
* @param i
* @param j
*/
public static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
/**
* 输出此数组
* @param a
*/
public static void show(Comparable[] a){
//单行打印数组
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();//换行
}
/**
* 判断数组是否已经排序完成
* @param a
* @return
*/
public static boolean isSorted(Comparable[] a){
//用于测试数组是否排序
for (int i=1;i<a.length;i++){
if(less(a[i],a[i-1])){
return false;
}
}
return true;
}
}
2.正题:选择排序思路简介
选择剩余元素之中的最小值,并与当前剩余元素的首元素交换位置
例如:3 8 4 1 2
第一次1和3交换——>1 8 4 3 2
第二次2和8交换——>1 2 4 3 8
第三次3和4交换——>1 2 3 4 8
… ——>1 2 3 4 8
… ——>1 2 3 4 8
第四次第五次应为都是剩余元素里面本身是最小,便和自己交换
更多实现细节在代码中有详细的注释!
3.完整代码实现与详细注释
package Algorithm.Sort;
/**
* 排序(1)
* 选择排序
* 找到数组中最小的元素,与第一个元素交换元素
* 剩下的元素中再找最小的元素,与第二个交换位置,以此类推
* (不断选择剩余元素中的最小值)
* 假设数组元素数量为:N
* 交换总次数固定为N
* 因此时间效率取决于元素之间比较次数
*/
public class SelectionSort extends Template {
//升序
public static void sort(Comparable[] a) {
int N = a.length;
System.out.println("排序过程:");
for (int i = 0; i < N; i++) {
//min为当前这次遍历中应该交换的下标(本次遍历最小元素的下标,默认为本次遍历的首元素下标)
int min = i;
//从当前默认最小值的下标的下一下标开始比较大小,后者小则更换min下标值
for (int j = i + 1; j < N; j++) {
if (less(a[j], a[min]))
min = j;
}
//本次遍历比较完所有元素后,交换下标为i和下标为min的值,使得min每次都位于剩余元素首部
exch(a, i, min);
//输出每次遍历的结果,查看排序过程
show(a);
}
}
public static void main(String[] args) {
String[] a = {"c", "s", "d", "n", "x", "i", "n", "g", "w", "e", "i"};
System.out.println("选择排序前");
show(a);
//执行选择排序逻辑
sort(a);
assert isSorted(a);
System.out.println("选择排序后");
show(a);
}
}