选择排序
最简单,也是最没用的排序算法,没用是因为选择排序的时间复杂度高并且还是不稳定的排序方法,项目中很少会用到
算法介绍
- 在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。
- 第二次从下一个数开始遍历 n-2个数,找到最小的数和第二个数交换。
- 重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。
算法可视化![在这里插入图片描述](https://img-blog.csdnimg.cn/20210711213326712.gif)
实现代码
算法实现 Selection.java
package sort.selection;
import sort.utils.SortUtils;
/**
* 选择排序
* 英文名称: Selection
* @author: liuxiangyu
* @date: 2020/7/28 23:37
*/
public class Selection {
public static void main(String[] args) {
// 获取随机数组
int[] array = SortUtils.getArray(10);
long startTime = System.currentTimeMillis();
for (int i = 0; i < array.length -1 ; i++) {
// 最小值位置
int minPos = i;
for (int j = i+1; j < array.length; j++) {
// 最小值位置之后的值和最小值位置的值比,如果小于最小值,则将该值的位置设置为最小值位置
if (array[j] < array[minPos]){
minPos = j;
}
}
// 交换位置
SortUtils.exchange(array,i,minPos);
}
long endTime = System.currentTimeMillis();
// 打印排序后数组
SortUtils.printlnArray(array);
System.err.println("数组长度:" + array.length + " 用时:" + (endTime - startTime) +"毫秒");
}
}
工具类 SortUtils.java
package sort.utils;
/**
* @author: liuxiangyu
* @date: 2020/7/29 00:02
*/
public class SortUtils {
/**
* 获取一个随机数组
* @return
*/
public static int[] getArray(int num){
int[] intArray = new int[num];
for (int i = 0; i < num; i++) {
intArray[i] = new Double(Math.random()*num * 10).intValue();
//intArray[i] = i;
}
return intArray;
}
/**
* 打印数组
* @param intArray
*/
public static void printlnArray(int[] intArray){
for (Integer integer : intArray) {
System.err.print(integer +" ");
}
System.err.println();
}
/**
* 交换数组两个位置的值
* @param array
* @param i
* @param j
*/
public static void exchange(int[] array,int i,int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}