选择排序
1.简介:
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。它的最坏、最好、平均时间复杂度均为为O(n2),选择排序是不稳定的排序方法。
2.算法原理:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
结合动态图理解一下:
(图片来源:十大经典排序算法(动图演示))
3.代码实现:
选择排序大体思路就是一次循环找到最小或最大的,然后放在最前或最后面。
我是在循环中找到较小的数,记录其下标,等一次循环结束后再交换。
还有一种思路是找到较小的数两数交换,一次循环结束时,可能交换次数不止是一次,这种思路有点冒泡的感觉,并且其时间复杂度的系数较高。
public static void xuanZe(int[] a){ for(int i = 0;i < a.length-1;i++) { int temp=0,min = i; for(int j = a.length-1;j > i;j--) { if(a[j] < a[min]){ min = j; } } temp = a[min]; a[min] = a[i]; a[i] = temp; } }
测试一波:
package sort; /** * @author yzh * @date 2019-07-15 17:12 */ public class XuanZe { public static void xuanZe(int[] a){ for(int i = 0;i < a.length-1;i++) { int temp=0,min = i; for(int j = a.length-1;j > i;j--) { if(a[j] < a[min]){ min = j; } } temp = a[min]; a[min] = a[i]; a[i] = temp; } } public static void main(String[] args) { int[] a = {4,97,64,3,19,-7,78,0,-90}; xuanZe(a); for(int i = 0;i < a.length;i++){ System.out.println(a[i]); } } }
测试结果
4.优缺点:
优点:移动数据的次数已知(n-1 次);
缺点:比较的次数多,效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。