1、直接选择排序概念:
从无序区中选一个最小的元素直接放到有序区的最后。
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。
2、直接选择排序特性:
时间复杂度:O(n^2)(最好时间复杂度:O(n^2) 最坏时间复杂度O(n^2) )
空间复杂度:O(1)
稳定性:不稳定
注:
(1)选择排序和冒泡排序的每一趟后,都有一个元素位于最终的位置。(最左或最右)
(2)选择排序过程中的比较次数与序列的初始状态无关,所有最好和最坏的时间复杂度都为O(n^2)
3、实现步骤:
设数组为arr[0...n-1]
1.初始化数组全为无序区arr[0...n-1]。令i=0
2.在无序区arr[0...n-1]中选取一个最小的元素,将其与arr[i]交换,交换之后arr[0...i]就形成了一个有序区。
3.i++并重复第二步直到i==n-1,排序完成。
例如:序列{38,97,26,19,38*,15}的直接选择排序过程如下图:
4、java代码实现
public void SelectSort(int[] arr){
int n = arr.length;
for(int i = 0;i<n;i++){
int minIndex = i;//设置最小元素的位置
for(int j = i+1;j<n;j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
//将这个元素放到无序区的开头
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}