クイックソート
アウトライン
バイナリツリーを横断する考えである前に、高速ソートアルゴリズムは、最終的には配列をソートするために、学びます。
利点:
アレイは、二分木を用いるバイナリ思考を有するので、それはソート高速でソートされた大量のデータのために
リミット
それだけでソートデータ格納構造(配列、ArrayListの、等)、ないチェーンのデータ構造の順序に適用します
アルゴリズムの考え方
そのような配列にI.ターゲットアレイ。データの場所以外の場所左に、アレイ内のすべてのデータが小さい場合、データは、位置データの位置を右側よりも大きいです。
アイデアの実現:
1.データの配列を削除する0
データは、0番目の位置より小さなデータの位置を通過する場合、アレイを横断する右端から出発2は、位置データは、ポインタの位置の下に左に割り当てられます。
3.トラバーサル方向を変更し、それがデータの左側に発見された場合、左から0より大きい位置データである横断開始、第2段位置に割り当てられた位置データは、ダウン滞在し、変化方向。
約添字一致するまで前記ステップ3ループは、横断
抽出された値の位置は、ドエルサイクルの終了時に、左右の手の位置0に割り当てられています
II。再帰的なアイデア、ソートの最終完了の描画順序トラバーサルの前に。
コードの実装
プライベートボイドクイックソート([]配列、INT開始、INT端をINT){
場合{(> =始端)
を返します。
}
INTキー=配列[開始]。
;開始=左int型
int型右=終了。
ブール方向=はtrue。
L1:
(左<右){ながら
IF(方向){
(I =右int型、私は>左; i--){
IF(配列[I] <キー){
アレイ[左++] =配列[i]は、
右= I;
!方向=方向。
L1を続けます。
}
}
左=右。
}他{
ため(私は左= int型、iが<右; iが++){
(配列[i]の場合>キー){
[I]配列[right--] =配列。
私は=左;
!方向=方向。
L1を続けます。
}
}
=右から左、
}
}
アレイ[左] =キー。
クイックソート(配列、開始は、左- 1)。
クイックソート(1 +左アレイ、エンド)。
}
テスト結果
@Test
公共ボイドtestQuickSort(){
int型[]配列=新しいINT [] {1、3、4、10、2、5、6、9、7、8}。
クイックソート(アレイ、0、Array.lengthと- 1)。
以下のために(INT i = 0; I <Array.lengthと; I ++){
するSystem.out.println(配列[I])。
}
}
プリント
1
2
3
4
5
6
7
8
9
10
マージソート
アウトライン
ソートと同じクイックソートマージ、同じ参照バイナリ思考、O(n)との時間の複雑さ、および最善の方法の一つとしては、すぐにデータのソート大量のソートします。
アイデア解析
周りの二つの配列へのターゲット配列でソートマージ、約2のアレイを注文した後、ソートを達成するために、2つの配列をマージする必要があります。任意の配列は、配列の数にすべてのデータとすることができるため、各配列要素は一つだけであり、その後二十から二を組み合わせ。(そのため、メモリのオーバーヘッドのマージソートはクイックソート以上になります)
コードの実装
プライベートボイドマージ(INT []配列、左INT、右INT){
IF(左> =右){
返します。
}
INT半ば=(左+右)>> 1。
マージ(アレイ、左、中)。
マージ(アレイ、ミッド+ 1、右)。
マージ(アレイ、左、中間、右+ 1)。
}
プライベートボイドマージ{([]配列INT、右INT、中間INT、左INT)
INT leftSize =ミッド-左。
int型rightSize =右-ミッド+ 1;
INT [] leftArray =新しいint型[leftSize]。
INT [] rightArray =新しいint型[rightSize]。
System.arraycopyの(アレイ、左、leftArray、0、leftSize)。
System.arraycopyの(アレイ、中間、rightArray、0、rightSize)。
int型のインデックス=左;
int型leftIndex = 0;
int型rightIndex = 0;
一方、(leftIndex <leftSize && rightIndex <rightSize){
IF(leftArray [leftIndex <rightArray [rightIndex]){
配列[インデックス++] = leftArray [leftIndex ++]。
}他{
配列[インデックス++] = rightArray [rightIndex ++]。
}
}
一方(leftIndex <leftSize){
配列[インデックス++] = leftArray [leftIndex ++]。
}
(rightIndex <rightSize){ながら
[rightIndex ++]配列[インデックス++] = rightArray。
}
}
テストコード
@Test
公共ボイドtestMergeSort(){
int型[]配列=新しいINT [] {1、3、4、10、2、5、6、9、7、8}。
マージ(アレイ、0、Array.lengthと- 1)。
以下のために(INT i = 0; I <Array.lengthと; I ++){
するSystem.out.println(配列[I])。
}
}
プリント
2
4
6
8
10