选择排序
原理
选择排序是比较排序的一种,它是每次从待排序的数据中找出最小或最大的数据放到前面,直到待排序的数据个数为0,
假设数据5,2,6,5,7,1,8
1、找到最小的1,和第一个位5进行交换
2、在2,6,5,7,5,8中找最小的,2,2在第二位是第二最小,待比较的数据中没有比2小的,不进行交换
3、待比较交换数据6,5,7,5,8中找到最小的,5是第三位最小的,5和6进行交换得到1,2,5,6,7,5,8
4、以此类推最终结果1,2,5,5,6,7,8
时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:不稳定,假如数据5,2,3,5,7,1,8,那么第一个5会和1进行交换,变成在第二个五的后面,所以是不稳定的
示例
import java.util.Random;
/**
* 选择排序
*
**/
public class SelectSortMain {
public static void main(String[] args) {
int len = 10;
int[] datas = new int[len];
Random r = new Random(0);
for(int i = 0; i < len;i++) {
int d = r.nextInt(100);
datas[i] = d;
}
long start = System.currentTimeMillis();
selectSort(datas);
long spend = System.currentTimeMillis() - start;
System.out.println("****** spend " + spend);
for (int data:
datas) {
System.out.print(data + ",");
}
}
public static void selectSort(int[] datas){
int len = datas.length;
if(len == 0){
return;
}
//排序趟数
for (int i = 0; i < len; i++) {
int minDataIdx = i;
//寻找最小值
for (int currIdx = i+1; currIdx < len; currIdx++){
//交换
if(datas[minDataIdx] > datas[currIdx]) {
minDataIdx = currIdx;
}
}
if(minDataIdx != i) {
int tmp = datas[minDataIdx];
datas[minDataIdx] = datas[i];
datas[i] = tmp;
}
}
}
}