「扫码关注我,面试、各种技术(mysql、zookeeper、微服务、redis、jvm)持续更新中~」
数据结构和算法是程序设计的灵魂,所以我们需要掌握基本的排序算法。
我们首先来聊选择排序,比如有一个数组,我们需要按照从小到大顺序进行排序,选择排序的思想在于从下标为0开始,依次向后遍历,寻找比下标为0的数据还小的数据放在下标为0的位置上,依此类推,下次取下标为1的数据继续向后遍历,寻找比下标为1的数据要小的数据放在下标1的位置上。那么核心在于每次选取下标位置上,废话不多说,上程序:
/**
* @Description: 选择排序(取最小数据下标)
* @Auther: wenqi
*/
public class SelectionSort {
public static void main(String[] args) {
int arr[] = {5,1,3,2,4,7,9,8,6};
for(int i=0;i<arr.length;i++){
//记录最小的下标位置
int minPos = i;
//循环遍历获取最小数据的下标位置
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[minPos]){
minPos = j;
}
}
//和最小数据换位置
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos]=temp;
//打印每次排序结果
for(int k=0;k<arr.length;k++){
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}
执行结果如下:
1 5 3 2 4 7 9 8 6
1 2 3 5 4 7 9 8 6
1 2 3 5 4 7 9 8 6
1 2 3 4 5 7 9 8 6
1 2 3 4 5 7 9 8 6
1 2 3 4 5 6 9 8 7
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
我们可以看出9个数据组成的数组执行了9次才能排序成功(当然可以减少一次比对),如果数据量大的话,那么比对的次数也会跟着增多。我们可以思考是不是有更有效的方式来减少数据移动的次数呢?我们可不可以每次选出一个最小数,一个最大数放到开始和末尾的位置,这样的话就可以减少一半的比对,上代码:
/**
* @Description: 选择排序优化(每次取一个最小、最大下标)
* @Auther: wenqi
*/
public class SelectionSort1 {
public static void main(String[] args) {
int arr[] = {5, 1, 3, 2, 4, 7, 9, 8, 6};
for(int i=0;i<arr.length/2;i++){
//定义最小、最大下标
int minPos = i;
int maxPos = arr.length-1-i;
//循环遍历获取最小、最大数据的下标位置
for(int j=i+1;j<arr.length-i;j++){
if(arr[j]<arr[minPos]){
minPos = j;
}else if(arr[j]>arr[maxPos]){
maxPos = j;
}
}
//和最小数据换位置
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos]=temp;
//和最大数据换位置
int temp1 = arr[arr.length-1-i];
arr[arr.length-1-i] = arr[maxPos];
arr[maxPos]=temp1;
//System.out.println("minPos:"+minPos+"|maxPos:"+maxPos);
//打印每次排序结果
for(int k=0;k<arr.length;k++){
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}
执行结果如下:
1 5 3 2 4 7 6 8 9
1 2 3 5 4 7 6 8 9
1 2 3 5 4 6 7 8 9
1 2 3 4 5 6 7 8 9
怎么样,是不是感觉相当棒,其实代码可以进行提炼,但是为了展示具体排序细节,就不提炼了。优化无止境!