选择排序与之前的冒泡排序有点相似,它们的相似之处就是两个算法经过一次排序下来都可以确定一个最大值或是一个最小值的位置,不同的是冒泡排序第一趟排序后除了最大值或者是最小值的位置是固定的其他的值是随机排序的,而选择排序的话,他仅仅是把最大值或是最小的位置与序列的第一个位置交换了,而其他位置上值没有发生改变。
那么从中我们便可以看出其规律(以从小到大排序为例),第一趟排序,找出最大值,使它与第一个数交换位置,第二趟排序,找出第二大的数字,使它与第二个数交换位置,依次类推,直至排好序。
搞清楚其中的原理编写其实现的代码便很简单了,关键代码如下:
for(int i = 0; i < a.length-1;i++){
int k = i;
for(int j = i+1;j < a.length;j++){
if(a[j] > a[k]){
k = j;
}
}
if(k !=i){
int temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
第一层循环不用说,就是排序需要排几次,这个和冒泡排序一样是n-1次,n是序列中数字的个数;第二层循环是找出剩下序列中最大的数字,因为第一个位置已经排好了,所以后面是选择第二个位置,所第二层循环是从i开始的,然后比较序列中的数字,找出第二大的位置,以此类推…完整的代码如下:
package com.itds.test;
/**
* @author tb
* @ClassName XuanZe
* @description 选择排序
* @DATE 2019/4/10 0010 10:30
**/
public class XuanZe {
public static void main(String[] args) {
int a[] = {5,2,3,6,4,1};
System.out.println("排序前的数组为:");
for(int t:a){
System.out.print(t+" ");
}
System.out.println(" ");
for(int i = 0; i < a.length-1;i++){
int k = i;
for(int j = i+1;j < a.length;j++){
if(a[j] > a[k]){
k = j;
}
}
if(k !=i){
int temp = a[i];
a[i] = a[k];
a[k] = temp;
}
System.out.println("第"+i+"次排序");
for(int t:a){
System.out.print(t+" ");
}
System.out.println(" ");
}
System.out.println("最后结果为:");
for(int t:a){
System.out.print(t+" ");
}
}
}
运行后的效果如图:
你也可以在第二层循环中的if判断中a[j] > a[k]改成a[j] < a[k]试一试看看输出结果有什么改变。