-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #20 from juitelavane/sortalgo
Fix: #14 Add new sorting algo (merge sort)
- Loading branch information
Showing
2 changed files
with
82 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# Merge Sort | ||
|
||
## What is merge sort? | ||
Merge sort is a sorting algorithm based on the Divide and conquer strategy. It works by recursively dividing the array into two equal halves, then sort them and combine them. | ||
It takes a time of (n logn) in the worst case. | ||
|
||
## Features of binary search | ||
-Merge Sort is useful for sorting linked lists. | ||
-Merge Sort is a stable sort which means that the same element in an array maintain their original positions with respect to each other. | ||
-Overall time complexity of Merge sort is O(nLogn). It is more efficient as it is in worst case also the runtime is O(nlogn) | ||
-The space complexity of Merge sort is O(n). This means that this algorithm takes a lot of space and may slower down operations for the last data sets. |
71 changes: 71 additions & 0 deletions
71
algorithms/searching and sorting/merge sort/merge sort.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#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); | ||
} | ||
|
||
|