选择排序(Selection-sort)其实是一种比较简单直观的排序算法。
算法原理
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
借助这个动图可以方便大家理解。
不多bb,看代码:
public static int[] paixu(int[]array){
int max=0;
int temp=0;
for (int i = 0; i <array.length-1 ; i++) {
max=i;
for (int j =i+1; j <array.length ; j++) {
if (array[j]<array[max]){
max=j;
}
}
if (max!=i){
temp=array[i];
array[i]=array[max];
array[max]=temp;
}
}
return array;
}
测试数据:
public static void main(String[] args) {
int[]array={0,1,5,3,-3,6,-10,60,20};
int[] paixu = paixu(array);
for (int i : paixu) {
System.out.println(i);
}
}
测试结果:
总结:
- 第一次循环拿数组第i个元素当作参数(i初始值为0),从第i+1个开始遍历,找到比第i个元素小或者大的元素,然后记录这个数据的下标。
- 代码中的max就是用来记录下标的,第一轮循环结束后,我们就找到了最小或者最大的元素,然后与第i个元素交换数据。
- 进行完双重for循环之后就可以完成对数组元素排序的任务了
很多小伙伴傻傻分不清楚
冒泡排序和选择排序的区别
冒泡排序与选择排序区别
很多小伙伴觉得选择排序和冒泡排序没有什么区别,其实区别也很明显,冒泡排序的交换数据实在第二个for循环的里面,这就导致,只要满足条件就会进行交换,可能会非常频繁的进行数据交换,而选择排序的交换数据是在第二个for循环外面进行,也就是说在进行完一次循环找到最小或者最大的元素并记录了这个数据的下标,然后再进行交换,这就免去了频繁的数据交换。可以说选择排序算法是在冒泡排序算法上进行了优化。也就是说
时间复杂度
我们很容易看出,选择排序无论如何都要走完双重for循环,因为就算在第二次for中发现max和i的值相等,那也只能说明当前元素是在剩下那些未排序的元素中刚好是最大或者最小的元素,无法保证下一个元素还是那些剩下未排序元素中最大或者最小的。所以只能走完双重for循环。那就很明显了,最好和最坏的情况时间复杂度都是O(n^2)
以上就是我对选择排序的理解,有什么错误的地方或者可以优化的地方,希望小伙伴们在评论区留言~~