java實現插入排序

2021-08-19 08:53:20 字數 1684 閱讀 3205

通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應的位置並插入。

插入排序非常類似於整撲克牌。

在開始摸牌時,左手是空的,牌面朝下放在桌上。接著,一次從桌上摸起一張牌,並將它插入到左手一把牌中的正確位置上。為了找到這張牌的正確位置,要將它與手中已有的牌從右到左地進行比較。無論什麼時候,左手中的牌都是排好序的。

如果輸入陣列已經是排好序的話,插入排序出現最佳情況,其執行時間是輸入規模的乙個線性函式。如果輸入陣列是逆序排列的,將出現最壞情況。平均情況與最壞情況一樣,其時間代價是θ(n2)。

也許你沒有意識到,但其實你的思考過程是這樣的:現在抓到一張7,把它和手裡的牌從右到左依次比較,7比10小,應該再往左插,7比5大,好,就插這裡。為什麼比較了10和5就可以確定7的位置?為什麼不用再比較左邊的4和2呢?因為這裡有乙個重要的前提:手裡的牌已經是排好序的。現在我插了7之後,手裡的牌仍然是排好序的,下次再抓到的牌還可以用這個方法插入。程式設計對乙個陣列進行插入排序也是同樣道理,但和插入撲克牌有一點不同,不可能在兩個相鄰的儲存單元之間再插入乙個單元,因此要將插入點之後的資料依次往後移動乙個單元。

假定n是陣列的長度,

首先假設第乙個元素被放置在正確的位置上,這樣僅需從1-n-1範圍內對剩餘元素進行排序。對於每次遍歷,從0-i-1範圍內的元素已經被排好序,

每次遍歷的任務是:通過掃瞄前面已排序的子列表,將位置i處的元素定位到從0到i的子列表之內的正確的位置上。

將arr[i]複製為乙個名為target的臨時元素。

向下掃瞄列表,比較這個目標值target與arr[i-1]、arr[i-2]的大小,依次類推。

這個比較過程在小於或等於目標值的第乙個元素(arr[j])處停止,或者在列表開始處停止(j=0)。

在arr[i]小於前面任何已排序元素時,後乙個條件(j=0)為真,

因此,這個元素會占用新排序子列表的第乙個位置。

在掃瞄期間,大於目標值target的每個元素都會向右滑動乙個位置(arr[j]=arr[j-1])。

一旦確定了正確位置j,

目標值target(即原始的arr[i])就會被複製到這個位置。

與選擇排序不同的是,插入排序將資料向右滑動,並且不會執行交換。

public

static

void insertsort(int

arr)

arr[j] =target;}}

穩定 

空間複雜度o(1) 

時間複雜度o(n2) 

最差情況:反序,需要移動n*(n-1)/2個元素 

最好情況:正序,不需要移動元素

陣列在已排序或者是「近似排序」時,插入排序效率的最好情況執行時間為o(n);

插入排序最壞情況執行時間和平均情況執行時間都為o(n2)。

通常,插入排序呈現出二次排序演算法中的最佳效能。

對於具有較少元素(如n<=15)的列表來說,二次演算法十分有效。

在列表已被排序時,插入排序是線性演算法o(n)。

在列表「近似排序」時,插入排序仍然是線性演算法。

在列表的許多元素已位於正確的位置上時,就會出現「近似排序」的條件。

通過使用o(nlog2n)效率的演算法(如快速排序)對陣列進行部分排序,

然後再進行選擇排序,某些高階的排序演算法就是這樣實現的。

插入排序 Java實現

插入排序 insertsort 插入排序通過把序列中的值插入乙個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。一般不用在資料大於1000的場合下使用插入排序,或者重複排序超過200資料項的序列。1 思想 每次選擇乙個元素k插入到之前已排好序的部分a 1 i 中...

JAVA實現插入排序

一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將新元素插入到該位...

插入排序 Java實現

插入排序,顧名思義就是將乙個數插入到一組已經生成的有序陣列當中,使之成為一組新的有序陣列。那麼我們考慮存在一組陣列,首先將p1插入到陣列中,使之成為有序陣列 接著將p2插入到陣列中,使之成為有序陣列.最後將pn插入到陣列中,使之成為有序陣列,這個有序陣列也就是我們最後的結果。附上 和實驗結果 pub...