public
class
insertsort
else
}*/
//可以簡化成這樣,注意是從i開始,而不是i+1.不要到最後乙個i+1越界。
for(
intj =i
;j>
0 && (
src[
j]<
src[j-
1]);
j--)
}
}
}
插入排序的乙個特性就是,中途可能會退出,不許要完全比較完未排序的序列。
時間複雜度:
最壞的情況就是到序的時候,插入第2個元素時要比較前1個元素,插入第3個元素時,要
比較前2個元素,……,插
入第n個元素,要
比較前 n - 1 個元素。因此,最壞情況下的比較次數是 1 + 2 + 3 + ... + (n - 1)也就是 n^2 / 2,所以最壞
情況下的複雜度為 o(n^2)。
最好情況下,陣列已經是有序的,每插入乙個元素,只需要比較前乙個元素,(比較完就退出了)因此最好情況下,
插入排序的時間復
雜度為o(n)
實測平均用時:
10000
name
:氣泡排序
1花費了
=73ms
name
:氣泡排序
2花費了
=67ms
name
:氣泡排序
3花費了
=58ms
name
:氣泡排序
4花費了
=58ms
name
:氣泡排序
5花費了
=60ms
平均:
51
50000
name
:氣泡排序
1花費了
=1684ms
name
:氣泡排序
2花費了
=1660ms
name
:氣泡排序
3花費了
=1486ms
name
:氣泡排序
4花費了
=1436ms
name
:氣泡排序
5花費了
=1482ms
平均:
1549
100000
name
:氣泡排序
1花費了
=6742ms
name
:氣泡排序
2花費了
=6700ms
name
:氣泡排序
3花費了
=5880ms
name
:氣泡排序
4花費了
=5888ms
name
:氣泡排序
5花費了
=5848ms
平均:
6211
總的看起來
還是比選擇排序用時長,比氣泡排序用時短。它能中斷所以比冒泡短,但是即使它可以中斷,但交換的
次數相對於選擇排序還是非常的多的,而一次的交換就意味著三次的賦值。
但是它可以改進,對插入排序進行改進,核心是利用每次需要交換元素時換成賦值的,把前面比較大的元素複製到它的後
乙個索引所在的位置(這個位置最開始的是要插入的那個元素,拿出來保留住),一直到最後,再把前面保留住的元素存入
到最後空出來的這個合適的位置。
改進後的**如下:
/**
* 改進後的插入排序。
* 核心改進思想:當發現比前面資料小的時候不是每次都要交換,而是通過賦值。
* 先把最初的元素的值取出來儲存,把當前位置往後賦值。迴圈到最後,再把取出來的數放入空出的位置。
* @param src 資料來源
*/
public
static
void
betterinsertsort
(int
src)
//迴圈完畢後,此時e>j或者j == 0了。一直比較的是j是當前索引,不符合的時候j-1賦值給j,然後j往前動1。
//此時還是比較當前所以,不符合那麼直接把拿出來的放這即可。
src[j
]=e;
}
}
10000
name
:氣泡排序
1花費了
=47ms
name
:氣泡排序
2花費了
=39ms
name
:氣泡排序
3花費了
=17ms
name
:氣泡排序
4花費了
=17ms
name
:氣泡排序
5花費了
=20ms
平均:
28
50000
name
:氣泡排序
1花費了
=949ms
name
:氣泡排序
2花費了
=934ms
name
:氣泡排序
3花費了
=414ms
name
:氣泡排序
4花費了
=418ms
name
:氣泡排序
5花費了
=421ms
平均:
627
100000
name
:氣泡排序
1花費了
=3892ms
name
:氣泡排序
2花費了
=3824ms
name
:氣泡排序
3花費了
=1708ms
name
:氣泡排序
4花費了
=1674ms
name
:氣泡排序
5花費了
=1710ms
平均:
2561
對比別的部落格的資料值可以看出來平均來說已經比插入快了,就是因為它有可能會中斷,不需要每次都查詢到未排
序序列的最後。
穩定性:穩定。
你想啊,只有小於的時候才進行插入,不然直接就break了。
演算法入門 java語言實現的氣泡排序小結
public class bubblesort 採用冒泡演算法,最外層從第乙個元素開始迴圈 for inti 0 i len i public static void main string args sort src for inti src 時間複雜度 最好的時間複雜度 正序 o n 好像是改進...
常用排序演算法Java語言實現
演算法原理 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除了最後乙個。4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。實現 ...
插入排序演算法 C語言實現
基本思想 每一步將乙個待排序的資料插入到前面已經排好序的有序序列中,直到插完所有元素為止。在有序陣列中插入當前元素key的時候,從有序陣列的最後乙個元素開始往前遍歷,如果a i key 則把a i 1 a i 即把比key大的元素以此朝後挪,給key值騰位置,一旦找到有序陣列中比key小的元素,那說...