本文首發於我的博客html
本系列排序包括十大經典排序算法。git
Sort
裏面實現了,交換,大小比較等方法。例如交換兩個值,直接傳入下標就能夠了。其餘的具體排序的類都繼承抽象類Sort
。這樣咱們就能專一於算法自己。/*
* 返回值等於0,表明 array[i1] == array[i2]
* 返回值小於0,表明 array[i1] < array[i2]
* 返回值大於0,表明 array[i1] > array[i2]
*/
protected int cmp(int i1, int i2) {
return array[i1].compareTo(array[i2]);
}
protected int cmp(T v1, T v2) {
return v1.compareTo(v2);
}
protected void swap(int i1, int i2) {
T tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
複製代碼
選擇排序的最壞、最好、平均時間複雜度爲 O(n^2)。 綜上,所以選擇排序總的平均時間複雜度爲O(n^2)。可是整體上要比冒泡排序要好。由於交換的次數少於冒泡排序github
public class SelectionSort <T extends Comparable<T>> extends Sort<T>{
@Override
protected void sort() {
// TODO Auto-generated method stub
for (int end = array.length-1; end >0; end--) {
int maxIndex = 0;
for (int begin = 1; begin <=end; begin++) {
if (cmp(maxIndex, begin)<=0) {
maxIndex = begin;
}
}
swap(maxIndex, end);
}
}
}
複製代碼
使用數據源以下算法
Integer[] array = {7, 3, 5, 8, 6, 7, 4, 5,19,30,40,50};數組
結果爲:bash
上一篇冒泡排序咱們是通過了一些代碼優化,那麼這一種選擇排序是否也能夠進行優化呢?答案是確定的。咱們可使用堆來選擇最大值,從而進行優化。後續文章會講到。ide