选择排序(Selection Sort)
选择排序算法的实现思路类似于插入排序,也分已排序区间和为排序区间,但是选择排序,每次都会从未排序区间中找到最小元素,将其放到已排序区间的末尾
详细代码
public static void selectSort(int[] arr){
//表示选择的趟数
for (int i = 0; i < arr.length-1; ++i) {
// 标记最大元素的位置
int maxPos = 0;
for (int j = 1; j < arr.length-i; ++j) { // O(n)
if(arr[j] > arr[maxPos])
maxPos = j;
}
// 将maxPos所标记的元素放在其应该再得位置 arr.length-1-i
if (maxPos != arr.length-1-i) {
swap(arr,maxPos,arr.length-1-i)
}
}
}
public void swap(int[] arr,int left,int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
优化:双向选择排序
每一次从无序区间选出最小 + 最大的元素,存放在无序区间的最前和最后,直到全部待排序的数据元素排完 。
小结
- 选择排序是原地算法吗?
是一种原地算法,所以空间复杂度是 O(1). - 选择排序是稳定的算法吗?
是不稳定的,选择排序每次都要找剩余未排序元素中的最小值和前面的元素交换位置,这样破坏稳定性,比如 5,8,5,2,9;第一次找到最小元素2,与第一个5交换,那第一个5和第二个5的顺序就变了,所以不稳定,因此相对于冒泡和插入排序,选择排序稍逊色。 - 选择排序的时间复杂度?
最好、最坏、平均都是 O(n^2).因为对于任何一个长度n数组,都先遍历n次找到最小的,再遍历n-1次 找到第二小的,无非是对于有序的话少了交换的操作