মার্জ সাজানোর কৌশলটি ডিভাইড অ্যান্ড কনকার্স টেকনিকের উপর ভিত্তি করে। আমরা পুরো ডেটাসেটটিকে ছোট ছোট অংশে বিভক্ত করি এবং সাজানো ক্রমে একটি বড় অংশে মার্জ করি। এটি সবচেয়ে খারাপ ক্ষেত্রেও খুব কার্যকর কারণ এই অ্যালগরিদমের সবচেয়ে খারাপ ক্ষেত্রেও কম সময়ের জটিলতা রয়েছে।
মার্জ সাজানোর কৌশলের জটিলতা
- সময়ের জটিলতা: O(n log n) সমস্ত ক্ষেত্রে
- স্পেস জটিলতা: O(n)
ইনপুট এবং আউটপুট
Input: The unsorted list: 14 20 78 98 20 45 Output: Array before Sorting: 14 20 78 98 20 45 Array after Sorting: 14 20 20 45 78 98
অ্যালগরিদম
একত্রীকরণ (অ্যারে, বাম, মধ্য, ডান)
ইনপুট - ডেটা সেট অ্যারে, বাম, মধ্য এবং ডান সূচক
আউটপুট - একত্রিত তালিকা
Begin nLeft := m - left+1 nRight := right – m define arrays leftArr and rightArr of size nLeft and nRight respectively for i := 0 to nLeft do leftArr[i] := array[left +1] done for j := 0 to nRight do rightArr[j] := array[middle + j +1] done i := 0, j := 0, k := left while i < nLeft AND j < nRight do if leftArr[i] <= rightArr[j] then array[k] = leftArr[i] i := i+1 else array[k] = rightArr[j] j := j+1 k := k+1 done while i < nLeft do array[k] := leftArr[i] i := i+1 k := k+1 done while j < nRight do array[k] := rightArr[j] j := j+1 k := k+1 done End
একত্রিত করুন(অ্যারে, বাম, ডান)
ইনপুট - ডেটার একটি অ্যারে, এবং অ্যারের নিম্ন এবং উপরের সীমা
আউটপুট - সাজানো অ্যারে
Begin if lower < right then mid := left + (right - left) /2 mergeSort(array, left, mid) mergeSort (array, mid+1, right) merge(array, left, mid, right) End
উদাহরণ
#include<iostream> using namespace std; void swapping(int &a, int &b) { //swap the content of a and b int temp; temp = a; a = b; b = temp; } void display(int *array, int size) { for(int i = 0; i<size; i++) cout << array[i] << " "; cout << endl; } void merge(int *array, int l, int m, int r) { int i, j, k, nl, nr; //size of left and right sub-arrays nl = m-l+1; nr = r-m; int larr[nl], rarr[nr]; //fill left and right sub-arrays for(i = 0; i<nl; i++) larr[i] = array[l+i]; for(j = 0; j<nr; j++) rarr[j] = array[m+1+j]; i = 0; j = 0; k = l; //marge temp arrays to real array while(i < nl && j<nr) { if(larr[i] <= rarr[j]) { array[k] = larr[i]; i++; }else{ array[k] = rarr[j]; j++; } k++; } while(i<nl) { //extra element in left array array[k] = larr[i]; i++; k++; } while(j<nr) { //extra element in right array array[k] = rarr[j]; j++; k++; } } void mergeSort(int *array, int l, int r) { int m; if(l < r) { int m = l+(r-l)/2; // Sort first and second arrays mergeSort(array, l, m); mergeSort(array, m+1, r); merge(array, l, m, r); } } int main() { int n; cout << "Enter the number of elements: "; cin >> n; int arr[n]; //create an array with given number of elements cout << "Enter elements:" << endl; for(int i = 0; i<n; i++) { cin >> arr[i]; } cout << "Array before Sorting: "; display(arr, n); mergeSort(arr, 0, n-1); //(n-1) for last index cout << "Array after Sorting: "; display(arr, n); }
আউটপুট
Enter the number of elements: 6 Enter elements: 14 20 78 98 20 45 Array before Sorting: 14 20 78 98 20 45 Array after Sorting: 14 20 20 45 78 98