简单选择排序
从待排序的数列中选择一个最小的数,放到有序数列的最后一位,最始的有序数列就是无序数列的第一个数,就相当于用数列的第一个元素分别与其它元素比较,选出最小数的下标,然后将最小数与有序数列的最一个数交换位置。因为每次选择的都是最小的数,所以经过排序之后,待排序数列变成有序(待排序数列中选择的最小的数实际上是有序数列中最大的数,因为比它更小的数已在上一次比较的时候被提到有序数列了)。
时间复杂度:O(n2)
java代码实现
/**
* 选择排序
* @param a
*/
public static void selectSort(int[] a){
//取数组长度
int len = a.length;
//取待排序数列中的第一个数做为最小的数
for (int i = 0 ;i<len -1;i++){
int min = i;
for (int j = i+1;j<len;j++){
//用设定的最小的数与待排序数列中的每一个数比较
if (a[min] > a[j]){
//如果发现假设的最小的数不是真正的最小的数,则将比他小的数的下标赋值给min
min = j;
}
}
if(min != i){//min不等于i,假设的最小值不是最小值,把真正的最小值交换到i的位置上去
swap(a,min,i);
}
//打印每次选择排序的结果
print(a,a.length,i+1);
}
//打印最终排序结果
printResult(a,a.length);
}
交换方法:
public static void swap(int[] elem,int i,int j){
int temp = elem[i];
elem[i] = elem[j];
elem[j] = temp;
}
打印每次比较结果的方法:
/**
* 打印每次比较的结果
* @param a 待排序数组
* @param n 数组长度
* @param i 第几次排序
*/
public static void print(int[] a,int n,int i){
System.out.println("第"+i+"次");
for (int j =0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
打印最终结果的方法:
/**
* 打印最终排序结果
* @param a
* @param n
*/
public static void printResult(int[] a,int n){
System.out.println("最终排序结果:");
for(int j = 0 ;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
结语:关于算法的性能分析,最好的方法就是在实际操作中进行体会,如果实在觉得有些地方不好理解,可以用笔画一下方法思路。