簡単に言えば、主に順序付けられたシーケンスにより規則配列をマージソート。
私たちは2つの単純な数字を初めて目5、2 、5及び2は、その後、為替の直接比較が位置になります2,5 。次に、2つの数値を追加4,3 、同様に、比較が交換なる 3,4。
私達は今、2,5 と 3,4順序付けられたシーケンスにこれら二つの配列、最初の考えは最も小さい番号を見つけることがあるかもしれない学生のアルゴリズムのための根拠は存在しない、の2番目の数が少ないです三つの小さな番号など、最終的に完了するために、新しい配列にそれを回します。
しかし、今日、我々は選択肢を議論している、我々は最初の最初の数字の2つのシリーズ2と3は、小さな選択のコンペア2新しい配列にして、第一配列の添字次々に移動します図3及び図5はし続けて小さく選択コンペア3を新しい配列に、次いで配列添字後に第2のシフト4及び5はし続けて小さく選択コンペア4の新しい配列、及び最終的に5に新しい配列は、この新しいアレイ上のデータがある2,3,4,5-順序付けられたシーケンス。これは、呼び出されたマージソート。
今、私たちは、マージソートのコードを見て:
public static void mergeSort(int arr[],int left,int right){
if(left>=right)return;
int mid=(right+left)/2;
mergeSort(arr,left,mid);
mergeSort(arr,mid+1,right);
merge(arr,left,mid,right);
}
private static void merge(int[] arr, int left, int mid, int right) {
int tmp[]=new int[right-left+1];
int leftIndex=left;
int rightIndex=mid+1;
int tmpIndex=0;
while (leftIndex<=mid && rightIndex<=right){
if(arr[leftIndex]<=arr[rightIndex]){
tmp[tmpIndex++]=arr[leftIndex++];
}else{
tmp[tmpIndex++]=arr[rightIndex++];
}
}
int start=leftIndex,end=mid;
if(rightIndex<=right){
start=rightIndex;
end=right;
}
while (start<=end){
tmp[tmpIndex++]=arr[start++];
}
for(leftIndex=0;leftIndex<=right-left;leftIndex++){
arr[left+leftIndex]=tmp[leftIndex];
}
}
添え字は、ソートされた配列のARRの境界線と右境界添字マージ方法を左、左と右、それぞれ配列ARR、これは再帰的な配列のパーティション、次いでソートマージの操作によるものです。それはより左余白以上右境界半分、これまでできなくなるまで常に半分配列、です。
今、我々は、アレイ見5、3、2、6、4、結合を参照すると実行される、請求マージ処理を行い、マージ方法。
5 3 2 6 4左1 = 0、右= 5
最初の再帰左5 3 2 = 0右= 2
左第再帰5 3 = = 1つの0右
= 0、左第5再帰左= 0右 > =右、リターン終了条件に達した
左左第再帰3 = 1つの右= 1 > =右、 リターン終了条件に達した
合成初めて 。3. 5右=左2 6 1 4 = 0 = 0.1 MID
第再帰2左= 2右= 2左 > =右、 リターン終了条件に到達する
第2の合成 2356 4 1左= 0ミッド= 2 = 1つの右
六再帰6 4 1左= = 3権利 5
六6 4が左再帰= 3右= 4
六再帰6左= 3右= 3左 > =右は、復帰終了条件に到達する
第再帰4左= 4右= 4左 > =右、 リターン終了条件に到達した
第三の合成。5. 3 2 4 6。1 = =左右。3. 4. 3 = MID
第再帰を左1 = 5右=左5 > =右、 リターン終了条件に達する
第組み合わせる。3. 5 2 。1. 4. 6 左= 3ミッド= 4右= 5
第五の合成 1。5. 4. 3. 6 左=右= 0 MID = 2 5
上記マージソートの詳細な実行手順で、マークされた赤色データ交換は、マージプロセスで起こります。
今すぐ詳細な分析でみましょう見マージ方法は、上記の例では、我々はマージの実装プロセスを見て最後の時間をマージするには:
まず、ソートされたデータを格納するためのtmp配列を作成します。次いで、中間左右サブアレイ2、それぞれ中心とに leftIndexとrightIndex 2つの添字を横断するため、より少ない数が選択され、その対応するインデックスに1を加え、無限は、エンドポイントに横断するまで。最後に、アレイTMPに残りのデータサブアレイは、元の配列ARRに缶にコピーされたデータをtmpです。
マージの最適化:
マージ方法については、最適化するための方法があります:
private static void mergeGuard(int[] arr, int left, int mid, int right) {
int[] leftArr = new int[mid - left + 2];
int[] rightArr = new int[right - mid + 1];
for (int i = 0; i <= mid - left; i++) {
leftArr[i] = arr[left + i];
}
// 第一个数组添加哨兵(最大值)
leftArr[mid - left + 1] = Integer.MAX_VALUE;
for (int i = 0; i < right - mid; i++) {
rightArr[i] = arr[mid + 1 + i];
}
// 第二个数组添加哨兵(最大值)
rightArr[right-mid] = Integer.MAX_VALUE;
int i = 0;
int j = 0;
int k = left;
while (k <= right) {
// 当左边数组到达哨兵值时,i不再增加,直到右边数组读取完剩余值,同理右边数组也一样
if (leftArr[i] <= rightArr[j]) {
arr[k++] = leftArr[i++];
} else {
arr[k++] = rightArr[j++];
}
}
}
主な店舗は、マージは、あなたが比較データが完了した後に必要とされていませんARR配列へのデータのすべてを前後になることができたときにそう、そう、追加データが国境を置くかという整数の配列の最大の境界であります新しい配列に。
要約:
基本的にパーティションの方法により、マージソート、ビットシーケンスは最終的にマージ、数に分割されます。人間の心が肯定的である。しかし、それを理解することはより困難である配列を命じたとき、逆のシーケンスは、その後、分割をマージします理解しやすいの数に統合されます。みんなでこの記事最初に使用する分割モードは、コアマージを理解し、次にあなたがマージソートの理解に深く行くために一歩ずつ取ります。