Merge sort is based on divide and conquer method. It
takes the list to be sorted and divide it in half to create two unsorted lists.
The two unsorted lists are then sorted and merged to get a sorted list. The two
unsorted lists are sorted by continually calling the merge-sort algorithm; we
eventually get a list of size 1 which is sorted. The two lists of size 1 are
then merged.
Best
case: When the array is already sorted O(nlogn).
Worst
case: When the array is sorted in reverse order O(nlogn).
Average
case: O(nlogn).
Space
Complexity: Extra space
is required, because space complexity is O(n) for arrays and O(logn) for linked
lists.
Method 1:
#include<stdio.h>
#include<conio.h>
void merge(int [],int ,int ,int );
void merge_sort(int [],int ,int );
int main() {
int arr[30], i, size;
printf("\n\t------- Merge Sorting Method -------\n\n");
printf("Enter How Many Data You Want To Sort: ");
scanf("%d",&size);
if(size<=0) printf("\n\tWrong Input?\n");
else {
printf("\n");
for(i=0; i<size; i++) {
printf("(%d) Enter Data: ",i+1);
scanf("%d",&arr[i]);
}
merge_sort(arr,0,size-1);
printf("\n\n\t---- Sorting In Ascending Order ----\n\n");
for(i=0; i<size; i++)
printf(" %d ",arr[i]);
getch();
}}
void merge_sort(int arr[],int min,int max)
{
int mid;
if(min<max) {
mid=(min+max)/2;
merge_sort(arr,min,mid);
merge_sort(arr,mid+1,max);
merge(arr,min,mid,max);
}}
void merge(int arr[],int min,int mid,int max) {
int tmp[30];
int i,j,k,m;
j=min;
m=mid+1;
for(i=min; j<=mid && m<=max ; i++) {
if(arr[j]<=arr[m]) /* To sort in descending order, change <= to
>= only. */ {
tmp[i]=arr[j];
j++;
}
else {
tmp[i]=arr[m];
m++;
}}
if(j>mid) {
for(k=m; k<=max; k++) {
tmp[i]=arr[k];
i++;
}}
else {
for(k=j; k<=mid; k++) {
tmp[i]=arr[k];
i++;
}}
for(k=min; k<=max; k++)
arr[k]=tmp[k];
}
Method 2:
#include<stdio.h>
#include<conio.h>
int tmp[50];
void merge(int,int,int);
void merge_sort(int min,int max) {
int mid;
if(min<max) {
mid=(min+max)/2;
merge_sort(min,mid);
merge_sort(mid+1,max);
merge(min,mid,max);
}}
void merge(int min,int mid,int max) {
int h,i,j,b[50],k;
h=min;
i=min;
j=mid+1;
while((h<=mid)&&(j<=max)) {
if(tmp[h]<=tmp[j]) /* To sort in descending order, change <= to
>= only. */ {
b[i]=tmp[h];
h++;
}
else {
b[i]=tmp[j];
j++;
}
i++;
}
if(h>mid) {
for(k=j;k<=max;k++) {
b[i]=tmp[k];
i++;
}}
else {
for(k=h;k<=mid;k++) {
b[i]=tmp[k];
i++;
}}
for(k=min;k<=max;k++)
tmp[k]=b[k];
}
int main() {
int num, i;
printf("------------------------------------------------------------------\n");
printf("---------------------- Merge Sorting Method ----------------------\n");
printf("------------------------------------------------------------------\n\n");
printf("Enter How Many Data You Want To Sort: ");
scanf("%d",&num);
if(num<=0) printf("\n\tWrong Input?\n");
else {
printf("\nEnter %d Elements: ",num);
for(i=1;i<=num;i++)
scanf("%d",&tmp[i]);
merge_sort(1,num);
printf("\nAfter Sorting In Ascending Order: ");
for(i=1;i<=num;i++)
printf("%d ",tmp[i]);
getch();
}}
Method 3:
#include <stdio.h>
#include<conio.h>
#include <stdlib.h>
void merge (int *A, int a, int *B, int b, int *C) {
int i,j,k;
i = 0;
j = 0;
k = 0;
while (i < a && j < b) {
if (A[i] <= B[j]) /* To sort in descending order, change <= to
=> only. */ {
C[k] = A[i];
i++;
k++;
}
else {
C[k] = B[j];
j++;
k++;
}}
while (i < a) {
C[k]= A[i];
i++;
k++;
}
while (j < b) {
C[k]= B[j];
j++;
k++;
}}
void merge_sort(int *A, int n) {
int i;
int *A1, *A2;
int n1, n2;
if (n < 2)
return;
n1 = n / 2;
n2 = n - n1;
A1 = (int*)malloc(sizeof(int) * n1);
A2 = (int*)malloc(sizeof(int) * n2);
for (i =0; i < n1; i++)
A1[i] = A[i];
for (i = 0; i < n2; i++)
A2[i] = A[i+n1];
merge_sort(A1, n1);
merge_sort(A2, n2);
merge(A1, n1, A2, n2, A);
free(A1);
free(A2);
}
int main(int argv, char** args) {
int i, n;
int *A;
char c;
printf("------------------------------------------------------------------\n");
printf("---------------------- Merge Sorting Method
----------------------\n");
printf("------------------------------------------------------------------\n\n");
printf("Enter How Many Data You Want To Sort: ");
scanf("%d", &n);
if(n<=0) printf("\n\tWrong Input?\n");
else {
A = (int *)malloc(sizeof(int) * n);
printf("\nEnter %d Elements: ",n);
for (i = 0; i < n; i++)
scanf("%d", &(A[i]));
merge_sort(A, n);
printf("\nAfter Sorting In Ascending Order: ");
for (i = 0; i < n; i++)
printf("%d ", A[i]);
free(A);
getch();
getch();
}}