插入排序之Java实现
一、聲明
算法思路部分借鑒于《算法導(dǎo)論》(第三版),實(shí)現(xiàn)過(guò)程均屬作者原創(chuàng),轉(zhuǎn)載或引用請(qǐng)注明出處。
?
二、算法概述
??? 插入排序算法適用于少量元素的排序。插入排序的過(guò)程就好比排序一副撲克牌。開(kāi)始時(shí),左手為空并且桌子上的牌面朝下。然后,每次從桌子上拿走一張撲克牌并將它插入左手中正確的位置。為了找到牌的正確位置,需要從右開(kāi)始將它與已在手中的每張牌進(jìn)行比較。每次插入結(jié)束后左手中的牌總是排序好的。
?
三、算法思路
1.位碼實(shí)現(xiàn)
INSERTION-SORT(A)for j = 2 to A.lengthkey = A[j] // 將桌面的牌拿至右手i = j -1 // 左手中已經(jīng)排序好的牌的數(shù)量while i > 0 and A[i] > key // 將右手中的key牌與左手中的牌從右到左進(jìn)行比較A[i+1] = A[i]i = i - 1A[i+1] = key // 將右手中的牌插入到左手中?
?
四、算法分析
最壞情況的運(yùn)行時(shí)間為Θ(n^2),所以不適合大量輸入的排序。
?
五、算法實(shí)現(xiàn)
1.InsertionSort類
InsertSort是抽象類,需要實(shí)例化時(shí)需要實(shí)現(xiàn)public abstract int elemCompare(T a, T b)方法,此方法描述了比較類型T兩個(gè)實(shí)例大小的策略。調(diào)用srot方法即可對(duì)ArrayList<T>進(jìn)行插入排序。
import java.util.ArrayList;/**
?* 作者原創(chuàng),引用請(qǐng)注明出處
?* @author ChameleonChen
?*/ public abstract class InsertionSort<T> {public static final int A_GREATER_THAN_B = 1;public static final int A_LESS_THAN_B = 2;public static final int A_EQUALS_B = 3;/*** 實(shí)現(xiàn)a b 兩個(gè)元素的比較策略。* ex:* int elemCompare(Integer a, Integer b) {* if (a > b) return InsertionSort.A_GREATER_THAN_B;* else if (a < b) return InsertionSort.A_LESS_THAN_B;* else return InsertionSort.A_EQUALS_B;* }* @param a* @param b* @return a大于b,返回InsertionSort.A_GREATER_THAN_B;a小于b,返回InsertionSort.A_LESS_THAN_B* a等于b,返回InsertionSort.A_EQUALS_B.*/public abstract int elemCompare(T a, T b); public static final int NON_DECREASING_SORT = 1; // 非遞減排序public static final int NON_INCREASING_SORT = 2; // 非遞增排序/*** 對(duì)elems進(jìn)行排序,改變其在內(nèi)存中的值。* 實(shí)現(xiàn)算法如下:* INSERTION-SORT(A)* for j = 2 to A.length* key = A[j]* * i = j - 1* while i > 0 and A[i] > key* A[i+1] = A[i]* i = i - 1* A[i+1] = key* * @param elems* @param sortType 排序的類型:非遞減排序 InsertionSort.NON_DECREASING_SORT;* 非遞增排序InsertionSort.NON_INCREASING_SORT*/public void sort(ArrayList<T> elems, int sortType) {if (elems == null){throw new NullPointerException("the elems can not be null");}int expected;switch (sortType) {case NON_DECREASING_SORT:expected = A_GREATER_THAN_B;break;case NON_INCREASING_SORT:expected = A_LESS_THAN_B;break;default :throw new IllegalArgumentException("the sortType's value is illegal");}T temp;for (int j=1,i; j<elems.size(); j++) {temp = elems.get(j);i = j - 1;while (i>=0 && elemCompare(elems.get(i), temp) == expected) {elems.set(i+1, elems.get(i));i = i - 1;}elems.set(i+1, temp);}} }
?
轉(zhuǎn)載于:https://www.cnblogs.com/chenshi/p/3889784.html
總結(jié)
以上是生活随笔為你收集整理的插入排序之Java实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU 3308 LCIS
- 下一篇: 人活着系列之芳姐和芳姐的猪(Floyd)