選擇排序
原理
選擇排序是比較排序的一種,它是每次從待排序的數(shù)據(jù)中找出最小或最大的數(shù)據(jù)放到前面仪或,直到待排序的數(shù)據(jù)個(gè)數(shù)為0确镊,
假設(shè)數(shù)據(jù)5,2范删,6蕾域,5,7,1旨巷,8
1巨缘、找到最小的1,和第一個(gè)位5進(jìn)行交換
2采呐、在2若锁,6,5斧吐,7又固,5,8中找最小的煤率,2仰冠,2在第二位是第二最小,待比較的數(shù)據(jù)中沒有比2小的蝶糯,不進(jìn)行交換
3洋只、待比較交換數(shù)據(jù)6,5昼捍,7识虚,5,8中找到最小的妒茬,5是第三位最小的担锤,5和6進(jìn)行交換得到1,2郊闯,5妻献,6蛛株,7团赁,5,8
4谨履、以此類推最終結(jié)果1欢摄,2,5笋粟,5怀挠,6,7害捕,8
時(shí)間復(fù)雜度:O(n2)
空間復(fù)雜度:O(1)
穩(wěn)定性:不穩(wěn)定绿淋,假如數(shù)據(jù)5,2尝盼,3吞滞,5,7,1裁赠,8殿漠,那么第一個(gè)5會(huì)和1進(jìn)行交換,變成在第二個(gè)五的后面佩捞,所以是不穩(wěn)定的
示例
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;
}
//排序趟數(shù)
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;
}
}
}
}