选择排序是一种常见的排序算法,它的实现比较简单。
1.选择排序的思想:
选择排序的思想有点类似插入排序,也是将数据分为有序部分和无序部分,每次将有序部分的数据与无序部分的第一个数据进行比较,得到最小元素的索引index,然后进行交换,从而实现有序。
2.代码实现:
package www.first;
public class selectSort {
public static void chooseSort(int[] a){
if(a.length<=1||a==null){
return;
}else{
//第一次的有序部分只有一个元素
for(int i = 0;i<a.length;i++){
int minIndex = i;
//找到最小元素的下标
for(int j = i+1;j<a.length;j++){
if(a[j]<a[minIndex]){
minIndex = j;
}
}
//进行交换
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = new int[]{1,3,2,5,4,6,2,8,0};
chooseSort(arr);
for(int a:arr){
System.out.print(a+" ");
}
}
}
结果如下:
3.选择排序总结:
- 时间复杂度:O(n^2)
- 空间复杂度:O(1),只开辟临时的空间用来交换,是原地排序算法
- 选择排序不是一种稳定的排序算法,选择排序每次都要找未排序元素中的最小值,并与前面的元素进行比较交换,破坏了稳定性。
4.选择排序与直接插入排序的对比:
我随机生成了10万条数据分别来进行两种排序,来看看结果:
看起来选择排序的效率并不是很好,所以平时不太使用。
生成10万条近乎有序的数据,结果如下:
可以看出,直接插入排序在近乎有序的情况下的性能远高于选择排序。