選擇排序:Selection Sort
這次說(shuō)的是最簡(jiǎn)單的——選擇排序
為啥說(shuō)他最簡(jiǎn)單呢?額,難度和冒泡相比的話差不多吧,思想上比冒泡還能簡(jiǎn)單點(diǎn),我覺(jué)得如果讓一個(gè)完全沒(méi)有概念的人去想排序方法的話,那么這個(gè)人八成首先想到的就是選擇排序。
原理
選擇排序的原理很簡(jiǎn)單:
1.遍歷整個(gè)數(shù)組,找出最小的那個(gè)數(shù),并記下它的位置~
2.把它放在第一個(gè)位置上
3.遍歷數(shù)組,這次從第二個(gè)數(shù)開(kāi)始(因?yàn)榈谝粋€(gè)數(shù)已經(jīng)是最小的了),選出最小的數(shù),并記下其位置~
4.把它放在第二個(gè)位置上
......
重復(fù)上面的操作,直到最后一個(gè)數(shù)。
很簡(jiǎn)單吧~
實(shí)現(xiàn)起來(lái)應(yīng)該也不難,想必大家都可以手敲出來(lái):
/**
* Created by AceCream on 2017/3/20.
* 選擇排序(SelectionSort)
* 通過(guò)選擇和交換來(lái)實(shí)現(xiàn)排序
* 1.首先從原始數(shù)組中選擇最小的1個(gè)數(shù)據(jù),將其和位于第一個(gè)位置的數(shù)據(jù)交換。
* 2.接著從剩下的n-1個(gè)數(shù)據(jù)中選擇里面最小的元素,和第二個(gè)位置數(shù)據(jù)進(jìn)行交換。
* 3.不斷重復(fù)
*
* 時(shí)間復(fù)雜度: 平均:O(n^2) 最佳:O(n^2) 最壞:O(n^2)
* 空間復(fù)雜度: O(1)
* 穩(wěn)定性: 不穩(wěn)定
*
*/
public class selectSort {
public static void selectSort(int value[]){
int index; //記錄位置
int temp;
for (int i=0;i<value.length;i++){
index = i;
//j=i+1 是為了不和自己比較,因?yàn)闆](méi)有意義
for (int j=i+1;j<value.length;j++){
if (value[j]<value[index]){
index = j;
}
}
//判斷一下,如果是自己,就不要執(zhí)行下面的步驟了
if (index!=i){
temp = value[i];
value[i] = value[index];
value[index] = temp;
}
}
}
public static void main(String[] args) {
int value[] = {12,15,9,20,6,31,24};
selectSort(value);
System.out.print("最終結(jié)果 ");
for (int result : value) {
System.out.print(result+" ");
}
}
}
這個(gè)很簡(jiǎn)單,但是簡(jiǎn)單要付出簡(jiǎn)單的代價(jià),代價(jià)就是時(shí)間復(fù)雜度實(shí)在的太高了,相比于其他排序,各項(xiàng)指標(biāo)都被完爆,恩,除了好寫。(選排:但是人家思想最簡(jiǎn)單~哼╭(╯^╰)╮)
堆排序:Heap Sort
顧名思義,是利用“堆”這種數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)出來(lái)的一種排序算法。
之前一直無(wú)法理解這種排序,結(jié)果發(fā)現(xiàn)是因?yàn)樽约簩?duì)堆概念的了解不足。(堆:“我當(dāng)然不是內(nèi)存模型里的堆,我是數(shù)據(jù)結(jié)構(gòu)里的堆,人家重名了?。?!重名!而已!”)
后續(xù)更新...
后記(可跳過(guò)不看)
普通人的思維是在最短時(shí)間內(nèi),找到能最簡(jiǎn)單的思路解決問(wèn)題的方式,也就是最好想的方式~但是想要成為優(yōu)秀的攻城獅,就需要鍛煉自己優(yōu)化解決問(wèn)題方式的能力,最短時(shí)間想到最優(yōu)解。同時(shí)還需要具備在后續(xù)給出優(yōu)化的可行方案!