在上一篇排序算法的博客中,小编已经带大家一起回顾了经典的冒泡排序,这篇博文中小编就与大家再次分享高效的选择排序!和冒泡排序相比,选择排序的比较次数和冒泡相同,但是交换次数远远少于冒泡排序;
在这里,小编先给大家提供一个插图来了解选择排序的逻辑结构:
有了基本了解之后,我们直接通过程序来进一步的明确选择排序的执行情况:
import java.util.Arrays;
import javax.swing.InputVerifier;
import com.sun.org.apache.bcel.internal.generic.INEG;
/**
*
* 将随机数组成的数组元素进行升序排序
* @author root
*
*/
public class SelectionSort {
//使用生成的随机数组成一个一维的int数组;
private static int[] input = new int[]{48,68,36,74,89,13,71
//(int)(Math.random()*100),
//(int)(Math.random()*100),
//(int)(Math.random()*100),
//(int)(Math.random()*100),
//(int)(Math.random()*100),
//(int)(Math.random()*100),
//(int)(Math.random()*100)
};
public static void main(String[] args) {
System.out.println(Arrays.toString(input));
/**
* 执行逻辑
* 1.将第i个作为要比较的对象
* 2.将第j个对象和第i个对象进行比较:
* 如果下标为i的元素小于 下标为j的元素,key的值不变,反之,i和j对应的元素交换位置;
* 同时index的下标发生相应的交换变化;
*
*/
for (int i = 0; i < input.length-1; i++) {
int key = input[i];
int index =i;
for (int j = i+1; j < input.length; j++) {
key = key
index = key < input[j] ? index: j;
}
input[index] = input[i];
input[i] =key;
System.out.println("第" + (i+1) + "次排序");
for (int k = 0; k < input.length; k++) {
System.out.println(input[k] + " ");
}
System.out.println(" ");
}
}
}
需要注意的是,在选择排序中,我们需要定义一个被比较的对象,也就是该轮排序的参照对象;小编将上述程序的循环过程整理出来:
i = 0 :将第1个元素作为指标,与其他元素进行比较;如果指标大,则将指标和
被比较的对象的key和index都进行互换;
j=1也就是将48和68进行对比;所以顺序不变;
j=2也就是48和36进行比较,不满足条件,所以index和key值都做相应的换位
(切记在这一步,input的值并不发生改变)
……
j=6到这里,36和13进行比较,循环到此结束,所以将13放到index=0的位置,
也就是说当前数组中13和48进行换位,即筛选出了最小值;
i=1;
j=1;
j=2
……
j=6
……
i=6:
j=1;
j=2
……
j=6
从上面的程序可以看出来,选择排序的每一次循环中,我们都会记下一个最小的一个元素的下标,待该轮所有比较结束之后我们便将最小的元素与未排序的那部分的最前的一个元素交换,完成这次的排序;这样也在减少交换的次数的同时,提高了排序的效率;这样我们便可以很容易的理解下面的运行结果:
可以看出,在每一次循环的时候,都会筛选未排序的部分中最小的元素,并放到序列的第N个元素的位置(也就是下标为N-1的位置);
最后,简单总结一下冒泡排序和选择排序:
以上就是小编对选择排序及与冒泡排序之间的比较的整理,希望能帮到大家理解和区分使用;