C++での3方向マージソート
マージソートでは、配列を再帰的に2つの部分に分割し、ソートして最後にマージします。マージソートの変形は、配列を2つの部分に分割する代わりに、3つの部分に分割する3方向のマージソートとして扱われます。
マージソートは、配列を再帰的にサイズが半分のサブ配列に分解します。同様に、3方向マージソートは配列をサイズの3分の1のサブ配列に分解します。
例
Input : 46, -1, -44, 79, 31, -41, 11, 20 , 74, 94 Output : -44 -41 -1 11 20 31 46 74 79 94 Input : 24, -18 Output : -18 24
3ウェイマージソートの時間計算量はnlog3です。 n。
例
// C++ Program for performing 3 way Merge Sort #include <bits/stdc++.h> usingnamespacestd; voidmerge1(intgArray1[], intlow1, intmid1, intmid2, inthigh1, intdestArray1[]){ inti = low1, j = mid1, k = mid2, l = low1; // choose smaller of the smallest in the three ranges while((i < mid1) && (j < mid2) && (k < high1)){ if(gArray1[i] < gArray1[j]){ if(gArray1[i] < gArray1[k]){ destArray1[l++] = gArray1[i++]; } else{ destArray1[l++] = gArray1[k++]; } } else{ if(gArray1[j] < gArray1[k]){ destArray1[l++] = gArray1[j++]; } else{ destArray1[l++] = gArray1[k++]; } } } while((i < mid1) && (j < mid2)){ if(gArray1[i] < gArray1[j]){ destArray1[l++] = gArray1[i++]; } else{ destArray1[l++] = gArray1[j++]; } } while((j < mid2) && (k < high1)){ if(gArray1[j] < gArray1[k]){ destArray1[l++] = gArray1[j++]; } else{ destArray1[l++] = gArray1[k++]; } } while((i < mid1) && (k < high1)){ if(gArray1[i] < gArray1[k]){ destArray1[l++] = gArray1[i++]; } else{ destArray1[l++] = gArray1[k++]; } } while(i < mid1) destArray1[l++] = gArray1[i++]; while(j < mid2) destArray1[l++] = gArray1[j++]; while(k < high) destArray1[l++] = gArray1[k++]; } voidmergeSort3WayRec(intgArray1[], intlow1, inthigh1, intdestArray1[]){ if(high1 - low1 < 2) return; intmid1 = low1 + ((high1 - low1) / 3); intmid2 = low1 + 2 * ((high1 - low1) / 3) + 1; mergeSort3WayRec(destArray1, low1, mid1, gArray1); mergeSort3WayRec(destArray1, mid1, mid2, gArray1); mergeSort3WayRec(destArray1, mid2, high1, gArray1); merge(destArray1, low1, mid1, mid2, high1, gArray1); } voidmergeSort3Way(intgArray1[], intn1){ if(n1 == 0) return; intfArray1[n]; for(inti = 0; i < n1; i++) fArray1[i] = gArray1[i]; // sort function mergeSort3WayRec(fArray1, 0, n, gArray1); for(inti = 0; i < n1; i++) gArray1[i] = fArray1[i]; } // Driver Code intmain(){ intdata1[] = {46, -1, -44, 79, 31, -41, 11, 20, 74, 94}; mergeSort3Way(data1,10); cout<< "After 3 way merge sort: "; for(inti = 0; i < 10; i++){ cout<< data1[i] << " "; } return0; }
出力
After 3 way merge sort: -44 -41 -1 11 20 31 46 74 79 94
-
リンクリストにマージソートアルゴリズムを実装するC++プログラム
マージソート手法は、分割統治手法に基づいています。 whileデータセットを小さな部分に分割し、並べ替えられた順序で大きな部分にマージします。このアルゴリズムは最悪の場合にも時間計算量が少ないため、最悪の場合にも非常に効果的です。 リンクリストは、merge-sortを使用して非常に効率的に並べ替えることができます。リンクリストの場合、マージタスクは非常に簡単です。リンクを更新してマージするだけです。このセクションでは、このアプローチを使用してリンクリストを並べ替える方法を説明します。 マージソート手法の複雑さ 時間計算量 −すべての場合のo(n log n) スペースの複雑さ
-
マージソートを実装するC++プログラム
マージソート手法は、分割統治手法に基づいています。 whileデータセットを小さな部分に分割し、並べ替えられた順序で大きな部分にマージします。このアルゴリズムは最悪の場合にも時間計算量が少ないため、最悪の場合にも非常に効果的です。 マージソート手法の複雑さ 時間計算量:すべての場合でO(n log n) スペースの複雑さ:O(n) Input − The unsorted list: 14 20 78 98 20 45 Output − Array after Sorting: 14 20 20 45 78 98 アルゴリズム merge(array、