-
-
Save MohamedSondo/7d7a7227b3ab2fae79c3b10b250e2c49 to your computer and use it in GitHub Desktop.
iterative merge sort
This file contains hidden or 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
/* Iterative C program for merge sort */ | |
#include<stdlib.h> | |
#include<stdio.h> | |
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */ | |
void merge(int arr[], int l, int m, int r); | |
// Utility function to find minimum of two integers | |
int min(int x, int y) { return (x<y)? x :y; } | |
/* Iterative mergesort function to sort arr[0...n-1] */ | |
void mergeSort(int arr[], int n) | |
{ | |
int curr_size; // For current size of subarrays to be merged | |
// curr_size varies from 1 to n/2 | |
int left_start; // For picking starting index of left subarray | |
// to be merged | |
// Merge subarrays in bottom up manner. First merge subarrays of | |
// size 1 to create sorted subarrays of size 2, then merge subarrays | |
// of size 2 to create sorted subarrays of size 4, and so on. | |
for (curr_size=1; curr_size<=n-1; curr_size = 2*curr_size) | |
{ | |
// Pick starting point of different subarrays of current size | |
for (left_start=0; left_start<n-1; left_start += 2*curr_size) | |
{ | |
// Find ending point of left subarray. mid+1 is starting | |
// point of right | |
int mid = left_start + curr_size - 1; | |
int right_end = min(left_start + 2*curr_size - 1, n-1); | |
// Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end] | |
merge(arr, left_start, mid, right_end); | |
} | |
} | |
} | |
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */ | |
void merge(int arr[], int l, int m, int r) | |
{ | |
int i, j, k; | |
int n1 = m - l + 1; | |
int n2 = r - m; | |
/* create temp arrays */ | |
int L[n1], R[n2]; | |
/* Copy data to temp arrays L[] and R[] */ | |
for (i = 0; i < n1; i++) | |
L[i] = arr[l + i]; | |
for (j = 0; j < n2; j++) | |
R[j] = arr[m + 1+ j]; | |
/* Merge the temp arrays back into arr[l..r]*/ | |
i = 0; | |
j = 0; | |
k = l; | |
while (i < n1 && j < n2) | |
{ | |
if (L[i] <= R[j]) | |
{ | |
arr[k] = L[i]; | |
i++; | |
} | |
else | |
{ | |
arr[k] = R[j]; | |
j++; | |
} | |
k++; | |
} | |
/* Copy the remaining elements of L[], if there are any */ | |
while (i < n1) | |
{ | |
arr[k] = L[i]; | |
i++; | |
k++; | |
} | |
/* Copy the remaining elements of R[], if there are any */ | |
while (j < n2) | |
{ | |
arr[k] = R[j]; | |
j++; | |
k++; | |
} | |
} | |
/* Function to print an array */ | |
void printArray(int A[], int size) | |
{ | |
int i; | |
for (i=0; i < size; i++) | |
printf("%d ", A[i]); | |
printf("\n"); | |
} | |
/* Driver program to test above functions */ | |
int main() | |
{ | |
int arr[] = {12, 11, 13, 5, 6, 7}; | |
int n = sizeof(arr)/sizeof(arr[0]); | |
printf("Given array is \n"); | |
printArray(arr, n); | |
mergeSort(arr, n); | |
printf("\nSorted array is \n"); | |
printArray(arr, n); | |
return 0; | |
} |
line 30 should be: int mid = min(left_start + sub_arr_size - 1, size - 1);
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
fails on 3,6,0,5,1,3,7,3,4,1