跟冒泡有丢相似的地方,冒泡大的往后冒,选择是小的往前选,外循环表示交换多少轮,内循环表示找到最小值,两次循环时间复杂度为O(n^2)
思路:
(1)有数组大小-1轮排序
(2)每一轮排序又会通过循环找到一个最小值
(3)如第一轮找到最小值(1--length)与第一个值a[0]交换,第二轮排序就从
(2--length)里找最小值,找到后与a[1]交换
(4)初始化时定义一个最小值和最小值下标
public static void winxuanzhe(int a[]){
for (int i = 0; i <a.length-1 ; i++) {
// 设置一个最小值变量
int min=a[i];
// 设置一个最小值下标变量
int xiabiao=i;
for (int j = i+1; j <a.length ; j++) {
if (min>a[j]){
// A.重置最小值
min=a[j];
// 重置最小值的下标
xiabiao=j;
}
}
// 优化了交换,当不等于当前循环下标证明下标没有变过也就是它就是最小值
if (xiabiao!=i){
// B.交换
a[xiabiao]=a[i];
a[i]=min;
}
}
// System.out.println(Arrays.toString(a));
}
测试:
int a[] = new int[80000];
for (int i = 0; i <a.length; i++) {
a[i] = (int) (Math.random() * 800000);
}
// 测试
Date d1 = new Date();
SimpleDateFormat s = new SimpleDateFormat("YY-MM-DD HH:mm:ss:SSS");
String s1 = s.format(d1);
System.out.println("排序前的时间;" + s1);
System.out.println("优化后");
winxuanzhe(a);
Date d2 = new Date();
String s2 = s.format(d2);
System.out.println("优化排序后时间;" + s2);
可以看到比冒泡快