插入排序-Java
1.算法描述
假定n是數(shù)組的長(zhǎng)度,
首先假設(shè)第一個(gè)元素被放置在正確的位置上,這樣僅需從1-n-1范圍內(nèi)對(duì)剩余元素進(jìn)行排序。對(duì)于每次遍歷,從0-i-1范圍內(nèi)的元素已經(jīng)被排好序,
每次遍歷的任務(wù)是:通過(guò)掃描前面已排序的子列表,將位置i處的元素定位到從0到i的子列表之內(nèi)的正確的位置上。
將arr[i]復(fù)制為一個(gè)名為target的臨時(shí)元素。
向下掃描列表,比較這個(gè)目標(biāo)值target與arr[i-1]、arr[i-2]的大小,依次類(lèi)推。
這個(gè)比較過(guò)程在小于或等于目標(biāo)值的第一個(gè)元素(arr[j])處停止,或者在列表開(kāi)始處停止(j=0)。
在arr[i]小于前面任何已排序元素時(shí),后一個(gè)條件(j=0)為真,
因此,這個(gè)元素會(huì)占用新排序子列表的第一個(gè)位置。
在掃描期間,大于目標(biāo)值target的每個(gè)元素都會(huì)向右滑動(dòng)一個(gè)位置(arr[j]=arr[j-1])。
一旦確定了正確位置j,
目標(biāo)值target(即原始的arr[i])就會(huì)被復(fù)制到這個(gè)位置。
與選擇排序不同的是,插入排序?qū)?shù)據(jù)向右滑動(dòng),并且不會(huì)執(zhí)行交換。
?
2.代碼
public static void InsertSort(int[] arr) {int i, j;int n = arr.Length;int target;//假定第一個(gè)元素被放到了正確的位置上//這樣,僅需遍歷1 - n-1for (i = 1; i < n; i++){j = i;target = arr[i];while (j > 0 && target < arr[j - 1]){arr[j] = arr[j - 1];j--;}arr[j] = target;} }3.效率分析
穩(wěn)定?
空間復(fù)雜度O(1)?
時(shí)間復(fù)雜度O(n2)?
最差情況:反序,需要移動(dòng)n*(n-1)/2個(gè)元素?
最好情況:正序,不需要移動(dòng)元素
數(shù)組在已排序或者是“近似排序”時(shí),插入排序效率的最好情況運(yùn)行時(shí)間為O(n);
插入排序最壞情況運(yùn)行時(shí)間和平均情況運(yùn)行時(shí)間都為O(n2)。
通常,插入排序呈現(xiàn)出二次排序算法中的最佳性能。
對(duì)于具有較少元素(如n<=15)的列表來(lái)說(shuō),二次算法十分有效。
在列表已被排序時(shí),插入排序是線(xiàn)性算法O(n)。
在列表“近似排序”時(shí),插入排序仍然是線(xiàn)性算法。
在列表的許多元素已位于正確的位置上時(shí),就會(huì)出現(xiàn)“近似排序”的條件。
通過(guò)使用O(nlog2n)效率的算法(如快速排序)對(duì)數(shù)組進(jìn)行部分排序,
然后再進(jìn)行選擇排序,某些高級(jí)的排序算法就是這樣實(shí)現(xiàn)的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/altlb/p/8318128.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: .Net Core 部署到 CentOS
- 下一篇: Java 系列之spring学习--sp