package com.leetcode.sort;
public class SelectSort {
/**
* 选择排序:
* 思想:
* 每一趟从待排序的数据元素中选择最小的一个元素作为首元素。
* 5 2 8 4 9 1
*
* 第一轮排序:
*从第一个数开始,即从下标为i=0的数开始
* 2 5 8 4 9 1 第一次比较 2跟5进行交换
* 2 5 8 4 9 1 第二次比较,2跟8比较,不动
* 2 5 8 4 9 1 第三次比较,2跟4比较,不动
* 2 5 8 4 9 1 第四次比较,2跟9比较,不动
* 1 5 8 4 9 2 第五次比较,2跟1比较,交换
*
* 比较了5次,length-(i+1)次
*
* 第二轮排序:
*从第二个数开始,即从下标为i=1的数开始
* 1 5 8 4 9 2 第一次比较5跟8比较,不动
* 1 4 8 5 9 2 第二次比较5跟4比较,变换
* 1 4 8 5 9 2 第三次比较4跟9比较,不动
* 1 2 8 5 9 4 第四次比较4跟2比较,变换
* 一共比较了4次,length-(i+1)次
*
* 第三轮排序:
*从第三个数开始,即从下标为i=2的数开始
* 1 2 8 5 9 4 第一次比较 8跟5比较,交换
* 1 2 5 8 9 4 第二次5跟9比较,不动
* 1 2 4 8 9 5 第三次5跟4比较,交换
* 比较了三次,length-(i+1)次
*
* 第四轮排序:
*从第四个数开始,即从下标为i=3的数开始
* 1 2 4 8 9 5 第一次比较 8跟9比较,不换
* 1 2 4 5 9 8 第二次比较 8跟5比较,交换
* 比较了两次,length-(i+1)次
*
* 第五轮排序:
*从第五个数开始,即从下标为i=4的数开始
* 1 2 4 5 9 8 第一次比较9跟8,交换
* 1 2 4 5 8 9
* 比较了一次,length-(i+1)次
*
* 全部排序结束,一共进行了五轮排序,length-1轮(length为数组个数),排序的次数为外层循环的长度。
* 每一轮选择排序中,是从i+1(i是指外层循环中的起始位置)个位置比较到最后length,比较的次数 为内存循环。
*
* 时间复杂度:比较次数为 N-1+ N-2+....+1=(N-1)(N-1+1)/2=n(n-1)/2.
* 所以时间复杂度为n^2. O(n2)
* @param args
*/
public static void main(String[] args) {
int arr[]={5, 2, 8 ,4, 9 ,1};
selectSort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
private static void selectSort(int[] arr) {
for(int i=0;i<arr.length-1;i++){//循环表示需要length-1轮 排序
int min=i;
for(int j=i+1;j<arr.length;j++){//循环表示每轮排序需要比较的 次数
if(arr[j]<arr[min]){
min=j;
}
}
/**
* 下面的判断的意思是:上面的for循环内部,找到了更小的值,所以j赋值给min
* n那么min!=i了
*/
if(min!=i){
int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
}
}