直接选择排序
基本思想:每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待 排序的数据元素排完 。
代码逻辑:
public static void selectSort1(int [] array){
long currentTime = System.currentTimeMillis();
for(int i = 0;i<array.length;i++){
//将当前的i记录为最小数值的下标
int minIndex=i;
for(int j=i+1;j<array.length;j++){
//从i后面的一个数据记为j,将j和最小下标的数据进行比较
//如果小于minindex的值就将j作为minindex,并再往后找有没有还小的值
if(array[j]<array[minIndex]){
minIndex=j;
}
}
//当所有的值都找完一遍后,此时的minindex是最小的值,将它与i进行交换
int temp=array[i];
array[i]=array[minIndex];
array[minIndex]=temp;
}
long spendTime = System.currentTimeMillis()-currentTime;
System.out.println("花费时间"+spendTime+"ms");
}
下面是对直接选择排序的改进,但时间复杂度没有改变.
改进:
原理:创建多个新的变量.right:最右边的值. left:最左边的值. maxindex:最大值的下标. minindex:最小值的下标.
以right和left作为一个区间.用一个参数i在这个区间里寻找最大值,最小值.找到后将最大值最小值交换到两边的right和left上, 随后将right和left进行加减缩小区间.
代码部分:
public static void selectSort2(int [] array){
int right = array.length-1;
int left = 0;
while (right>left) {
int maxIndex=left;
int minIndex=left;
for (int i = left+1; i <= right; i++) {
//将整个区间遍历完,找到最大值最小值
if(array[i]>array[maxIndex]){
maxIndex=i;
}
if(array[i]<array[minIndex])
{
minIndex=i;
}
}
//将最大值最小值交换到左右两边.
swap(array,left,minIndex);
//有一个特殊情况,当left的值就是最大值时.在进行上面的一次交换后,
//maxIndex就已经不是最大值了变成minIndex的值了
//当将上面操作完时,将min的值给max就是获取到了交换后的最大值的位置
if(left==maxIndex){
maxIndex=minIndex;
}
swap(array,right,maxIndex);
right--;
left++;
}
}
时间复杂度O(),空间复杂度O(1), 是不稳定排序.
3万+



被折叠的 条评论
为什么被折叠?



