选择排序
上一篇博客我们说了关系比较密切的插入排序和希尔排序,这篇博客我们来盘一盘选择排序.
选择排序的思想很简单,从所有数据中选一个最小的放在第一个,然后从第二个数据开始选出最小的那个放到第二个以此类推:
private void swap(int[]arr,int i,int j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
public void selectSort(int[]arr){
for (int i = 0; i < arr.length; i++) {
int minIndex=i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
swap(arr,i,minIndex);
}
}
我们可以明显感觉到,选择排序是一遍又一遍遍历了数组,经过简单地思考我们发现不管数据是否有序选择排序都是要遍历完的,其实我们还可以双管齐下,一边找最大一边找最小:
public void selectSort2(int[] arr){
int left=0;
int right=arr.length-1;
for(int i=0;i<arr.length;i++){
int minIndex=i;
int maxIndex=i;
for(int j=i+1;j<arr.length-i;j++){
if(arr[j]<arr[minIndex]){
minIndex=j;
}
if(arr[j]>arr[maxIndex]){
maxIndex=j;
}
}
//如果最大的正好是第一个,按照我们刚才的分析,是要把最小的放在
//第一个的,这样子我们就找不到最大值了,所以要提前准备
if(maxIndex==left){
maxIndex=minIndex;
}
swap(arr,minIndex,left);
swap(arr,maxIndex,right);
left++;
right--;
不能越界
if(left>right){
break;
}
}
}
使用双管齐下方法呢,代码变长了,不出意外的话运算时间应该会短一些,但是就时间复杂度来看,并没有任何改变.
希望我的这篇博客可以帮助到兄弟们.
百年大道,你我共勉!!