选择排序与冒泡排序类似,为哈这么说呢,冒泡排序是相邻的两个元素两两相比较,而选择排序则是用一个元素与其后面的所有元素依次相比较,记录下标,至本次循环结束相对应的两个元素进行位置互换。
空间复杂度:在原序列进行操作,故为 O( 1 );
时间复杂度:需要 2 次循环遍历,故为 O( n * n );
代码如下:
import java.util.Arrays;
public class 选择 {
public static void selectionSort(int[] arr) {
if(arr == null || arr.length<2)
return;
for(int i=0;i<arr.length-1;i++) {
int minIndex=i;
for(int k=i+1;k<arr.length;k++) {
if(arr[minIndex]>arr[k])
minIndex = k;
}
if(minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = {12,32,65,885,2,5,96,55,21,6,54,98};
selectionSort(arr);
System.out.println(Arrays.toString(arr));
}
}
选择排序与冒泡排序,插入排序都属于同一思想排序,这种排序算法思想简单,往往会用于其它复杂排序算法的子序列排序。
局限性:
1.运行时间和输入无关
为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶地发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长!我们将会看到,其他算法会更善于利用输入的初始状态。
2.数据移动是最少的
每次交换都会改变两个数组元素的值,选择排序用了 N 次交换——交换次数和数组的大小是线性关系,但其他算法大部分的增长数量级都是线性对数或是平方级别。