选则排序算法是排序算法中最简单的一种,这种排序算法只需要经历两次循环就可以成功完成排序,但是,这种排序算法的可行性也需要考虑,因为时间复杂度达到了O(n^2)。
我们首先看看选择排序的基本思想:第一趟从n个元素中选取最小的作为第一个元素,第二趟从剩余的n-1个元素中选取最小的作为第二个元素,一直重复这个步骤直到最后一个元素。
简单选择排序的伪代码描述如下:
selectionSort(a[0...n-1]){
//用选择排序算法对数组a[0...n-1]进行排序
//输入:可排序数组a[0...n-1]
//输出:有序数组a[0...n-1]
for i←0 to n-1 //控制循环次数
j←selectMinKey(a[i...n-1]); //选出剩余元素的最小值,将其赋给a[i]
a[i]↔a[j];
}
int selectMinKey(a[0...n-1]){
//选取数组a[0...n]中最小值得下标
//输入:数组a[0...n]
//输出:数组a[0...n]中最小值得下标j
j←0;
for i←0 to n-1
if a[i]<=a[j] j←i;
return j;
}
这个算法中有两层循环,外层循环主要控制循环次数,内层循环主要是选出最小值。
这个算法简单是简单,可是时间复杂度达到了O(n^2),前辈们在不断改进这个算法的过程中发明了树形选择排序,以及后来进一步衍生出堆排序。
package com.poe.sort;
import java.util.Scanner;
/**
* 选择排序
* @author Sam
*
*/
public class SelectSort {
private static int[] array; //要排序的数组,由命令行输入
/**
* 选出从指定位置开始到数组结束的最小值,并返回其下标
* @param a要搜索的数组
* @param start开始位置
* @return 返回最小值对应的下标
*/
public static int selectMinKey(int[] a,int start){
int j = start; //用来保存比较时较小的下标,开始时就是开始位置
for(int i = start;i
=a[i]){
j = i;
}
}
return j; //返回最小值对应的下标
}
/**
* 用选择排序算法对数组进行排序
* 选择排序算法:第i趟排序从n-i+1个数中选出最小值,将之与第i个元素交换位置,
* 这样进行n趟
* @param a表示待排序数组名
*/
public static void selectSort(int[] a){
for(int i=0;i