排序演算法一般都會有幾個較為基礎通用的方法,如下表
方法名作用
issorted()
判斷陣列是否有序
less(int item1, int item2)
比較第乙個引數是否小於等於第二個引數
exch(int a, int b)
交換這兩個索引位置的元素
show()
列印陣列
sort()
具體待實現的排序演算法
具體參考如下
public
abstract
class
sort
public
boolean
issorted()
return
true;}
public
boolean
less
(int item1,
int item2)
public
void
exch
(int a,
int b)
}public
void
show()
public
abstract
void
sort()
;}
之前是用泛型來做的,後考慮學習演算法主要的是理解邏輯,所以使用簡單的int簡單而且更直觀
1 選擇排序
主要過程是:首先找到陣列中最小的那個元素,其次,將它和陣列中低乙個元素交換位置(若最小的元素是自己,則與自己交換一次)。然後在剩下的元素中依次找出最小的元素,與第二個位置的元素做交換。以此類推,直到排序到最後乙個元素,則完成整個陣列的排序。
最大的特點是,執行時間與輸入無關,且資料移動是最少的。對於長度是n的陣列,選擇排序需要大約n²/2次比較和n次交換。
class
choiceshort
extends
sort
@override
public
void
sort()
exch
(i, min);}
}}
2 插入排序
從第二個元素開始,依次從右往左比較,遇到比當前元素大的則交換位置,反之則為已經插入到了當前元素對應的位置,然後選取下乙個元素開始下一輪的比較。
class
insertshort
extends
sort
@override
public
void
sort()
}}}
因為每個元素向前尋找對應的位置時都經歷了多次比較以及交換,所以可以在內迴圈中先找到對應應該插入的位置,然後之間的元素都做乙個向後移動即可。
@override
public
void
sort()
//最後把item插入到對應的位置
mlist[pos]
= item;
}}
插入排序適合情況:
陣列中每個元素距離它的最終位置都不遠
乙個有序的大陣列接乙個小陣列
陣列中只有幾個元素的位置不正確
當倒置的數量很少時,插入排序很可能是最快的演算法,總的來說插入排序適合部分有序的陣列,也很適合小規模的陣列,往往用於高階排序中分為小規模部分的排序。
3 希爾排序
因為在大規模亂序陣列的插入排序很慢,因為它只會交換相鄰的元素,所以希爾排序是在這個基礎上進行的改進,使陣列中任意間隔為h的元素都是有序的。意思為h個間隔為h的有序陣列編制在一起組成的乙個陣列,進行排序時移動的距離和h的大小有關,也為更小的h有序創造方便。希爾排序更高效的原因是因為它權衡了子陣列的規模和有序性。排序之初,各個子陣列都很短,排序只會子陣列都是部分有序的,這兩種情況都很適合插入排序。子陣列部分有序的程度取決於遞增序列的選擇,透徹理解希爾排序的效能在今天也是一項挑戰。
class
shellshort
extends
sort
@override
public
void
sort()
} h = h /3;
}}}
演算法複習筆記 排序演算法比較
最近正好複習複習演算法,於是從排序演算法開始做乙個總結。以下的 均為原創,如果有任何問題,歡迎指正。簡單來講,排序演算法的實質是將長度為n的陣列中的數字按照從小到大或者從大到小的順利排列。簡而言之,在不考慮演算法的情況下,我們可以把排序抽象為如下的乙個函式 array表示t型別的乙個陣列,num表示...
排序演算法複習
參考自 直接插入排序 從小到大排列 n個資料,第乙個資料平凡有序 假設前i 1個資料串有序,根據第i個的大小將第i個插入到此串中,則前i個的資料串也有序。因此可得到n個資料有序。插入方法 待插入元素為第i元素,數值存為temp,將 i 之前的元素 j 從第 i 1 元素開始與之比較 如果比temp大...
演算法複習 排序
排序中主要有插入排序 氣泡排序 歸併排序 快速排序等 主要從空間消耗 時間複雜度 最差時間複雜度等方面考慮演算法的好處 1.插入排序 插入排序是一種簡單直觀的排序演算法。它的工作原理非常類似於我們抓撲克牌 對於未排序資料 右手抓到的牌 在已排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應位置...