排序算法-选择排序
选择排序
基本介绍
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
选择排序思想:
选择排序(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 次,得到一个按排序码从小到大排列的有序序列。
选择排序思路分析图:
- 对一个数组的选择排序再进行讲解
选择排序应用实例:
有一群牛 , 颜值分别是 101, 34, 119, 1 请使用选择排序从低到高进行排序 [101, 34, 119, 1]
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | package com.xuge.sort; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; /** * author: yjx * Date :2022/5/3014:01 **/ public class SelectSort { public static void main(String[] args) { // int arr[]={101,34,119,1}; // System.out.println("==========排序前========="); // System.out.println(Arrays.toString(arr)); // selectSort(arr); // // System.out.println("=========排序后========="); // System.out.println(Arrays.toString(arr)); int arr2[]= new int [ 80000 ]; for ( int i = 0 ; i < 80000 ; i++) { arr2[i]=( int )(Math.random()* 80000000 ); //生成随机数[0,80000000); } System.out.println( "====输出数组=====" ); Date data = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); String str=sdf.format(data); System.out.println( "排序前的时间是:" +str); //54 selectSort(arr2); Date data2 = new Date(); String str2=sdf.format(data2); System.out.println( "排序后的时间是" +str2); //59 } public static void selectSort( int []arr){ //逐步推导 //101,34,119,1 //1,34,119,101 //时间复杂度o(n2) // System.out.println(Arrays.toString(arr)); for ( int i = 0 ; i < arr.length - 1 ; i++) { //1.假定最小值 int min=arr[i]; int minIndex=i; //开始比较 //2.第一轮最小值一级最小值索引找到 for ( int j=i+ 1 ;j<arr.length;j++){ if (min>arr[j]){ //min不是最小值 //重置最小值 min=arr[j]; //重置index minIndex=j; } } //3.将最小值与arr[i]交换 if (minIndex!=i){ arr[minIndex]=arr[i]; arr[i]=min; } } /* System.out.println(); int minIndex=0; //1.假定最小值 int min=arr[0]; //开始比较 //2.第一轮最小值一级最小值索引找到 for(int i=0+1;i<arr.length;i++){ if(min>arr[i]){//min不是最小值 //重置最小值 min=arr[i]; //重置index minIndex=i; } } //3.将最小值与arr[0]交换 if(minIndex!=0){ arr[minIndex]=arr[0]; arr[0]=min; } System.out.println("=========第一轮后========="); System.out.println(Arrays.toString(arr)); minIndex=1; //1.假定最小值 min=arr[1]; //开始比较 //2.第一轮最小值一级最小值索引找到 for(int i=0+2;i<arr.length;i++){ if(min>arr[i]){//min不是最小值 //重置最小值 min=arr[i]; //重置index minIndex=i; } } //3.将最小值与arr[0]交换 if(minIndex!=1){ arr[minIndex]=arr[1]; arr[1]=min; } System.out.println("=========第二轮后========="); System.out.println(Arrays.toString(arr)); minIndex=2; //1.假定最小值 min=arr[2]; //开始比较 //2.第一轮最小值一级最小值索引找到 for(int i=0+3;i<arr.length;i++){ if(min>arr[i]){//min不是最小值 //重置最小值 min=arr[i]; //重置index minIndex=i; } } //3.将最小值与arr[0]交换 if(minIndex!=2){ arr[minIndex]=arr[2]; arr[2]=min; } System.out.println("=========第三轮后========="); System.out.println(Arrays.toString(arr)); */ } } |