ソートアルゴリズム(a)と挿入ソートのJava実装

コードの実装:

公共ボイド挿入ソート(リスト<T>リスト、コンパレータ<T>コンパレータ){
(I = 1をint型、私は(はlist.sizeを<); iが++)のために{
T elt_i = list.get(I)。
int型J =;

一方、(J> 0){
T elt_j = list.get(J-1)。
IF(comparator.compare(elt_i、elt_j)> = 0){
破ります。
}
list.set(J、elt_j)。
j--;
}
list.set(J、elt_i)。
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
测试。

リスト<整数>リスト=新規のArrayList <整数>(は、Arrays.asList(3、5、1、4、2))。

コンパレータ<整数>コンパレータ=新しいコンパレータ<整数>(){
@Override
公共のint(整数elt1、整数elt2)を比較{
elt1.compareToを返す(elt2)。
}
}。

ListSorter <整数> =新しい新しいListSorterソーター<整数>();
sorter.insertionSort(リスト、コンパレータ)
のSystem.out.println(リスト)
。1
2
3
4
5
6
7
8
9
10
11
12は、
ネストされた挿入ソート2お察しのように、サイクルは、その実行時間が次です。この場合、一般的には右ですが、その結論を下す前に、あなたが運転して数nの各サイクルを確認する必要があり、配列の大きさに比例しています。

アウターループ1からはlist.sizeまで反復()、従ってnはリストのサイズに線形です。0へのIから内部ループ反復は、N個の線形でもあります。したがって、2サイクル動作の総数は二次です。

あなたがわからない場合は、ここでの証明は次のとおりです。

最初のサイクルにおいて、I = 1、内側ループは、最大で一度実行されます。第二に、私は2つのサイクル運転の最大値、2 =。最後に、I = N - 1、最大n回の動作サイクル。

1とそのN(N - - 1)/ 2このように、サイクルの総数は、実行順序1、2、...、nです。N ^ 2のような式(最高指数)の主項目。

最悪の場合には、挿入ソートは二次です。しかし:

これらの要素が注文した、またはそれに近いされている場合は、挿入ソートは線形です。各要素の距離がk個の要素のその順序付けられた位置を超えていない場合は具体的には、その後、内側ループがk以上を実行していない、総実行時間はO(KN)です。
簡単、低コストのために、実行時間は^ 2、係数の主要項目であるが、つまり、それは小さくてもよいです。
私たちは、ほぼ整然と配列を知っている、または大きくないのであれば、挿入ソートは良い選択かもしれません。
---------------------

おすすめ

転載: www.cnblogs.com/ly570/p/11106211.html
おすすめ