排序是一个最基础的算法,是也一个比较简单的算法,我们都必须要掌握,其中的设计思想是这样的:
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,酱它与数组的第二个元素交换位置。如此重复,直到将整个数组排序。(不断选择剩余元素中的最小者)。
这里我用两种编程方法来设计排序算法,分别是直接main实现和方法实现
第一个是用一个比较简单的main实现,简单理解:
public class SelectionSortMain {
public static void main(String[] args) {
String[] a = {"E","O","A","U","I"}; //定义一个数组
for(int i = 0; i < a.length;i++) {
for(int j = i+1 ; j < a.length;j++) {
if(a[j].compareTo(a[i]) < 0) {
//compareTo()方法是对比两者之间的ASCII值
String temp = a[i]; //定义一个临时变量储存temp
a[i]=a[j]; //位置交换
a[j] = temp;
}
}
System.out.print("第"+ (i+1) +"次排序:");
for(int k = 0;k < a.length;k++) {
System.out.print(a[k]+" ");
}
System.out.println();
}
}
}
输出结果:
可以看到每次循环后交换的位置是怎样实现的。
接下来是更高级点的方法实现,实现思想也是一样的,只是相比起来更加模块化
public class SelectionSort {
public static void main(String[] args) {
String[] a = {"E","A","C","M","O","Y","K","L","U","W","Z"};
SelectSortsort(a);
show(a);
}
public static void SelectSortsort(Comparable[] a) {
//将A升序排列
int N=a.length; //获取数组长度
for(int i = 0;i < N;i++) {
//将a[i]和a[i+i...N]中最小的元素交换
int min = i;
for(int j = i+1;j<N;j++) {
if(less(a[j],a[min]))
min = j;
}
exch(a,i,min);
}
}
/**
* less()方法对元素进行比较
* @param v
* @param w
* @return
*/
private static boolean less(Comparable v,Comparable w) {
return v.compareTo(w) < 0;
}
/**
* 该方法将元素交换位置
* @param a
* @param i
* @param j
*/
private static void exch(Comparable[] a,int i ,int j) {
Comparable t =a[i];
a[i] = a[j];
a[j] = t;
}
/**
* 遍历函数
* @param a
*/
private static void show(Comparable[] a) {
for(int i = 0;i<a.length;i++) {
System.out.print(a[i]+" ");
System.out.println();
}
}
}
该教程参考图书 算法(第四版)