插入排序之Java实现
生活随笔
收集整理的這篇文章主要介紹了
插入排序之Java实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、聲明
算法思路部分借鑒于《算法導論》(第三版),實現(xiàn)過程均屬作者原創(chuàng),轉(zhuǎn)載或引用請注明出處。
?
二、算法概述
??? 插入排序算法適用于少量元素的排序。插入排序的過程就好比排序一副撲克牌。開始時,左手為空并且桌子上的牌面朝下。然后,每次從桌子上拿走一張撲克牌并將它插入左手中正確的位置。為了找到牌的正確位置,需要從右開始將它與已在手中的每張牌進行比較。每次插入結(jié)束后左手中的牌總是排序好的。
?
三、算法思路
1.位碼實現(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牌與左手中的牌從右到左進行比較A[i+1] = A[i]i = i - 1A[i+1] = key // 將右手中的牌插入到左手中?
?
四、算法分析
最壞情況的運行時間為Θ(n^2),所以不適合大量輸入的排序。
?
五、算法實現(xiàn)
1.InsertionSort類
InsertSort是抽象類,需要實例化時需要實現(xiàn)public abstract int elemCompare(T a, T b)方法,此方法描述了比較類型T兩個實例大小的策略。調(diào)用srot方法即可對ArrayList<T>進行插入排序。
import java.util.ArrayList;/**
?* 作者原創(chuà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;/*** 實現(xiàn)a b 兩個元素的比較策略。* 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; // 非遞增排序/*** 對elems進行排序,改變其在內(nèi)存中的值。* 實現(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实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 3308 LCIS
- 下一篇: 人活着系列之芳姐和芳姐的猪(Floyd)