一、实现原理
从第一个元素开始,依次遍历整个数组,找到最大元素的位置,将最大元素与数组最后一位元素互换位置,排好最大的数。再一次进行循环排好最大的数的前一位,以此类推。
图示
二、代码
//选择排序
public static void selectSort(int[] array){
for(int i=0;i<array.length-1;i++){//趟数 length-1时,区间中只有一个元素,不需要排序
int MaxPox=0;//具体选择方式
for (int j=1;j<array.length-i;j++){
if(array[j]>array[MaxPox]){
MaxPox=j;
}
}
if(array.length-1-i!=MaxPox){
swap(array,MaxPox,array.length-1-i);
}
}
}
三、优化
在选择排序的基础上一次性同时将最大最小的元素排好,效率是普通选择排序的2倍
//选择排序优化
public static void selectSortOP(int[] array){
int begin=0,end=array.length-1;
while (begin<end){
int maxPos=begin;
int minPos=begin;
int index=begin+1;
while (index<=end){
if(array[index]>array[maxPos]){
maxPos=index;
}
if(array[index]<array[minPos]){
minPos=index;
}
index++;
}
//将最大元素放在区间最后位置
if (maxPos!=end){
swap(array,maxPos,end);
}
//如果最小元素刚好在区间最后一个位置,必须更新minPos
if(minPos==end){
minPos=maxPos;
}
if (minPos!=begin){
swap(array,minPos,begin);
}
begin++;
end--;
}
}
四、性能分析
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定