本文为原创资源,欢迎分享,转载。
选择排序也是十大排序算法中的一种,他是将整个数组从头到尾全部扫描一遍,然后选择最小的与第一位进行交换,接着再在剩下的元素中进行扫描,直到扫描完毕,最终,得到一个有序数列。这是一种思路非常简单的排序算法。我们先简单的实现一下,代码如下:public static void main(String[] args) { int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 }; int n = arr.length - 1;// 经过n-1次提取最小最大值 long startTime = System.nanoTime(); // 获取开始时间 for (int i = 0; i arr[j]) { min = j; } } if (min != i) { int tmp = arr[min]; arr[min] = arr[i]; arr[i] = tmp; } } long endTime = System.nanoTime(); // 获取结束时间 System.out.println("排序结果:" + Arrays.toString(arr)); System.out.println("程序运行时间: " + (endTime - startTime) + "ns"); }
打印结果如下:排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]程序运行时间:3100ns
最基本的选择排序是一次将一个元素进行位置的确定,那么我们可不可以一次确定两个元素的位置呢?优化代码如下:public static void main(String[] args) { int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 }; long startTime = System.nanoTime(); // 获取开始时间 // 最小值下标 int min = 0; // 最大值下标 int max = 0; int left = 0; int right = arr.length - 1; int j = 0; // 循环size-1次 while (left arr[max]) { max = j; } if (arr[j]
打印结果如下:排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]程序运行时间:2600ns
有朋友要问了,为什么要加上这段代码呢:if (min == right) { min = max; }
比如数组{ 1, 3, 4, 2, 6, 7, 8, 0, 5 };max=0,min=8;max!=8,交换0和8,[0, 1, 2, 3, 4, 5, 6, 7, 8]但是max依旧是0,minpos依旧是8,min!=0,又再次交换0和8. 所以为防止min在最大值要插入的位置,要加上上面这块代码。
本篇会收录在满满干货-软文分类中,欢迎转载,分享!!!!
往期好文:
java基础算法系列(冒泡排序的简单优化讲解一)
java基础算法系列(二)冒泡排序的优化讲解(鸡尾酒算法)
java学会这些,我就入门啦!(基础篇一)栈与堆
java学会这些,我就入门啦!(基础篇二)重载与重写
java学会这些,我就入门啦!(基础篇三)异常讲解与常见的异常
java学会这些,我就入门啦!(基础篇四)String、StringBuffer、StringBuilder的区别?
java学会这些,我就入门啦!(基础篇五)流与IO流
java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别