原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排序好的序列最后,直到全部记录排序完毕。基于此思想的算法主要有简单选择排序、树形选择排序和堆排序(这里只介绍常用的简单选择排序);
简单选择排序的基本思想:给定数组int arr={里面n个数据};,第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与arr[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小数据,将它与arr[i]交换,直到全部排序完成;
举例:数组 int[] arr={5 2 8 4 9 1}
第一趟排序:
最小数据1,把1放在首位,排序结果:1 2 8 4 9 5
第二趟排序:
最小数据2,排序结果:1 2 8 4 9 5
第三趟排序:
最小数据4,排序结果:1 2 4 8 9 5
第四趟排序:
最小数据5,排序结果:1 2 4 5 9 8
第五趟排序:
最小数据8,排序结果:1 2 4 5 8 9
注:每一趟排序获得最小数的方法:for循环进行比较,定义一个第三个变量tmp,首先前两个数比较,把较小的数放在tmp中,然后用tmp再去跟剩下的数据比较,如果出现比tmp小的数据,就用它代替tmp中原有的数据;
示例代码:
public class Test {
public static void main(String[] args) {
int[] arr = {6, 3, 8, 2, 9, 1};
System.out.println("排序前数组为:");
for(int i : arr) {
System.out.print(i + ", ");
}
System.out.println();
sort(arr);
System.out.println("排序后数组为:");
for(int i : arr) {
System.out.print(i + ", ");
}
}
public static void sort(int[] arr) {
for(int i=0; i<arr.length - 1; i++) { //做第i趟排序
int k = i;
for(int j = i+1; j<arr.length; j++) { //选最小的记录
if(arr[k] < arr[j]) {
k = j; //记下目前找到的最小值所在的位置
}
}
if(k != i) { //内循环结束,执行交换
int tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
}
}
}
选择排序的时间复杂度为O(N^2),空间复杂度为O(1),
不稳定,因为正序时移动最少,反序时移动最多。
来源:https://www.cnblogs.com/yuanfei1110111/p/10203020.html