定义:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
这里先给大家这个简单比较容易理解的版本:
public void selectSort(int[] array){
for(int i=0;i<array.length;i++){
int minindex=i;
for(int j=i+1;j<array.length;j++){
if(array[minindex]>array[j]){
minindex=j;
}
}
swap(array,minindex,i);
}
}
public void swap(int[]array,int i,int j){
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
进行测试:
测试成功!!!
????当然我们还有一种选择排序的另一种实现方法,我们每次遍历的时候,都选择两个元素,一个是这次遍历的最小元素,一个是最大的元素,分别放到数组的最左和最有端,然后就和上面的逻辑一样,继续遍历,更新最大值和最小值,遍历结束。
这里也把代码给大家,这端代码说起来简单,但是还是有很多的小细节的,大家细细品味一下。
public void selectSort2(int[] array) {
int left=0;
int right=array.length-1;
while(left<right){
int minIndex=left;
int maxIndex=left;
for(int i=left;i<right;i++){
if(array[i]>array[maxIndex]) maxIndex=i;
if(array[i]<array[minIndex]) minIndex=i;
}
swap(array,minIndex,left);
//[10,6,4,8,7]这个例子大家按照代码的逻辑画个图
//就会发现,排序失败原因是maxIndex==left我们在
//第一次交换之后就会把maxIndex对应的值交换到minIndex中了
//所以必须加一个判断
if(left==maxIndex) maxIndex=minIndex;
swap(array,maxIndex,right);
left++;
right--;
}
}
我把需要注意的地方注释出来了,希望大家还是可以自己在纸上画一下,这样会对整个过程有一个更加全面的认识。
1.直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定