喜欢把代码讲解写在代码注释里,方便大家边看代码边看解释。
简单选择排序是一种很简单的排序,和冒泡有很多相似之处,比如两层for循环 ;
但是时间复杂度太高了,最好最坏都是O(n^2)
上代码:
/**
* 简单选择排序是选择类排序的一种
*
* 基本思想:数组长度n,第一趟选择排序,n个数中找到最小值,然后与第一个元素交换;
* 第二趟选择排序,范围是从第二个元素到结尾,n-1个元素的范围中寻找最小值和第二个元素交换,依次类推
*
* 从这可以看出,这种算法移动数据的次数很少,每轮顶多一次,但是由于总的比较次数是:(n-1)+(n-2)+.....+2+1 = n*(n-1)/2
* 即进行比较操作的时间复杂度是 :O(n^2)
*
* 空间复杂度为:O(1)
*
* 最好情况是 :完全有序,则没有移动的次数 ,时间复杂度为 O(n^2)
* 最坏情况是: (这个需要想一会)第一个数据最大,其余数据--从小到大--排列,此时移动次数最多,为3*(n-1)
* 时间复杂度为 O(n^2)
*
* 排序过程中需要进行比较的次数与初始状态下待排序的数据排列情况无关
*/
public class Test {
private static int data[]; // 数组方便测试,限定长度为10
/**
* 两层循环和冒泡相似,第二层循环也是相似,只是冒泡每次比较中是交换过程,而选择是循环结束,可能进行一次交换
*/
public static void Sort() {
int temp; // 交换的介质, 定义在循环外,节省内存空间
for (int i = 0; i < 9; i++) { // 第一层for ,循环n-1次
int min = i; // 保存每一趟的最小的元素的下标
for (int j = i + 1; j < 10; j++) { // i+1到9的范围,即i后面到末尾的数据范围
if (data[j] < data[min]) {
min = j;
}
}
if (min != i) { // min每轮循环初始值就是i 所以一旦被更改,即data[min]比data[i]小
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}
}
/**
*
* 输出当前数组
*/
public static void PrintData() {
for (int i = 0; i < 10; i++) {
System.out.print(" " + data[i]);
}
System.out.println("");
}
public static void main(String[] args) {
data = new int[10];
Scanner scanner = new Scanner(System.in);
System.out.println("输入十个数字进行-简单选择排序-排序");
for (int m = 0; m < 10; m++) {
data[m] = scanner.nextInt();
}
Sort();
PrintData();
scanner.close();
}
}