本文是关于本人对选择排序的一些理解,建议与本人上篇博客 [Algorithm]冒泡排序 一起看,如有错误,还望大神指正。
注:本文的排序都是指升序序列。
上篇博客了解了冒泡排序,今天来了解一下选择排序是如何排序的?原理你了解吗?
相信图片能最直观快速的展示选择排序的原理,一起看看吧。
![](https://i-blog.csdnimg.cn/blog_migrate/fef38aa67877f7cdf548874cc2d36790.png)
不用我多说,大家应该都知道,这不就是每轮选出一个最小的元素放好,选择 n-1 轮就得到正确的排序了。是的!现在知道选择排序是如何排序的了,能不能看着这张图片,写出选择排序的算法呢?大家都试试吧!
算法思路:
首先根据图片原理,我们可以得知一共比较 n-1 轮,每轮比较 n-1-i 次,可以得知,一定是两循环嵌套。在内层循环开始比较,每轮选出最小的元素和与原位置元素进行交换。看看算法具体是如何实现的!
public static void SelectionSort(int[] arr) {
int k,temp;
for(int i = 0;i < arr.length-1;i++) {
k = i;
for(int j = i+1; j < arr.length;j++) {
if(arr[k] > arr[j]){
k = j;
}
}
if(k != i){
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
}
这时,体育老师让同学排队,直接说,最矮的同学你和第一排的同学交换一下位置,第二矮的同学和第二排的同学换一下位置。这样是不是很快队伍就排好了,不用像冒泡排序那样繁琐了,每两个人比较一下,换一次,再比较 n-1轮。
了解了选择排序以后,有人问:那这样直接让选择排序替代冒泡排序不就好了,反正效率提高很多。刚开始我也这么认为,为什么选择排序不直接替代了冒泡排序呢?为什么还有人用冒泡排序?
选择排序虽然效率高,但是是有缺点的,选择排序是不稳定的。如果一个序列中有两个相等的数据元素,那排完序这两个元素的位置可能会颠倒。看个图片就清晰了。
上图中本来绿色5在橙色5前面的,排完序两个元素位置颠倒了。但很多情况下,我们需要相同的元素还要按照原来的位置进行排列。这时,使用选择排序就不太适合了,就可以选择冒泡排序。所以,每个排序算法都有各自的优缺点,我们要根据需求选择适当的排序算法。