排序算法——选择排序
一、基本介绍
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的
二、选择排序思想
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]-arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]-arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]-arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]-arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
三、选择排序图解
四、选择排序优化思路
在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半。第一次选择最大值与最小值.
五、源码
/**
* @author(作者):Liubaoteng
* @date(创建日期):2022/7/27 11:53
* 选择排序
* *****************************************************************************
*/
public class SelectSort {
public static void main(String[] args) {
// int arr[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
// selectSort2(arr);
// System.out.println(Arrays.toString(arr));
int[] arr = new int[80000];
for(int i =0; i < 80000;i++) {
arr[i] = (int)(Math.random() * 8000000); //生成一个[0, 8000000) 数
}
System.out.println("80000条数据排序开始:");
long start1 = System.currentTimeMillis();
// selectSort1(arr);//7693
selectSort2(arr);//1432
long end1 = System.currentTimeMillis();
System.out.println("80000条数据排序结束:");
System.out.println("80000条数据排序耗时:"+(end1-start1));
}
//选择排序-简单版
public static void selectSort1(int[] arr){
int temp = 0;
for(int i = 0;i<=arr.length-1;i++){
for(int j = i+1;j<=arr.length-1;j++){
if(arr[i]>arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
/**
*选择排序优化版
* 在一趟遍历中,同时找出最大值与最小值,放到数组两端,
* 这样就能将遍历的趟数减少一半。第一次选择最大值与最小值
**/
public static void selectSort2(int[] arr){
int temp = 0;
int right = arr.length-1;
for(int i = 0;i<=right;i++){
for(int j = i+1;j<=right;j++){
if(arr[i]>arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
if(arr[right] < arr[j]){
temp = arr[right];
arr[right] = arr[j];
arr[j] = temp;
right--;
}
}
}
}
}