0% found this document useful (0 votes)
2 views19 pages

Merge Sort DATA

Merge Sort is a divide and conquer algorithm that recursively splits an array into two halves, sorts them, and merges them back together. The merge function plays a crucial role by combining two sorted arrays into a single sorted array, with a time complexity of O(n) for merging. The overall time complexity of Merge Sort is O(n log n), making it efficient for sorting large datasets.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views19 pages

Merge Sort DATA

Merge Sort is a divide and conquer algorithm that recursively splits an array into two halves, sorts them, and merges them back together. The merge function plays a crucial role by combining two sorted arrays into a single sorted array, with a time complexity of O(n) for merging. The overall time complexity of Merge Sort is O(n log n), making it efficient for sorting large datasets.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

1.

Merge Sort Algorithm Overview


Merge Sort is a Divide and Conquer algorithm for sorting
an array.

Divide and Conquer Technique in Merge


Sort
InMerge Sort, the array is divided into two halves, sorted
separately and then merged. This process is repeated for
each half until there are no more elements to divide.

Merge Function in Merge Sort


The merge function is a crucial part of Merge Sort. It takes
two sorted arrays as input, merges them and returns a
single array which is also sorted.

Merging Sorted Sublists in Merge Sort


The Merge function works on the principle of merging two
sorted sublists. It iterates through each sublist and
compares the smallest elements. The smallest element is
then added to the output array and the process is
continued until one sublist is empty.

Handling Remaining Elements in Sublists


Once one of the sublists is empty, the remaining elements
in the other sublist are added to the output array in the
same order.

Copying Sorted Elements to Original Array


After the two halves have been sorted and merged, the
sorted elements are copied back to the original array.
Time Complexity of Merge Function
The time complexity of the Merge function is O(n), where
n is the number of elements in the input array.

Time Complexity of Merge Sort


The time complexity of Merge Sort is O(n log n) due to the
divide and conquer nature of the algorithm.

Merge Function Logic and Implementation


Here's a sample implementation of the Merge Function:

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; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
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++;
}
}
Recursive Call in Merge Sort
The Merge Sort function calls itself recursively to divide
the array into smaller subarrays and merge them back
together:

void mergeSort(int arr[], int l, int r)


{
if (l < r)
{
// Same as (l+r)/2, but avoids overflow
for

// large l and h
int m = l + (r - l) / 2;

// Sort first and second halves


mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);

merge(arr, l, m, r);
}
}
Merge Function Loop Conditions
The loop condition in the Merge function iterates through
the two subarrays and compares the smallest elements to
merge them back together. The loop continues until one of
the subarrays is empty:

while (i < n1 && j < n2)


{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{

arr[k] = R[j];
j++;
}
k++;
}

[Link] and Conquer Technique


in Merge Sort
Merge Sort Algorithm Overview

 Merge sort is a divide and conquer algorithm that works


by recursively splitting an array into two equal halves,
then merging the sorted subarrays.
 The basic idea is to decompose the problem of sorting
an array into smaller subproblems of sorting two halves
of the array.
Copying Sorted Elements to Original Array

 After merging two sorted subarrays, it's necessary to


copy the sorted elements back to the original array.
 This is done to ensure that the original array is sorted
after the merge sort algorithm is complete.
Time Complexity of Merge Function

 The time complexity of the merge function is O(n),


where n is the number of elements in the subarrays
being merged.
 This is because the merge function makes a single pass
through both subarrays, taking constant time to
compare and swap elements.
Merge Sort Example Walkthrough
 To understand how merge sort works, it's helpful to walk
through an example step-by-step.
 This involves dividing the array into smaller subarrays,
merging the subarrays, and copying the sorted elements
back to the original array.
Merge Function in Merge Sort

 The merge function is a key part of the merge sort


algorithm.
 It takes two sorted subarrays as input, merges them into
a single sorted array, and returns the merged array.
Recursive Call in Merge Sort

 The merge sort algorithm uses a recursive call to split


the array into smaller subarrays.
 The recursive call continues until the subarrays contain
only one element, at which point the array is considered
sorted.
Merging Sorted Sublists in Merge Sort

 The merge function in merge sort is responsible for


merging two sorted sublists.
 It does this by iterating through both sublists and
comparing the elements to determine which element
should come first in the merged array.

Time Complexity of Merge Sort

 The time complexity of merge sort is O(n log n), where n


is the number of elements in the array.
 This is because merge sort splits the array into two
halves at each level of recursion, which takes log n time,
and merges the sorted subarrays in linear time.
Handling Remaining Elements in Sublists

 When merging two sublists in merge sort, it's important


to handle any remaining elements in the sublists.
 This can be done by checking whether one sublist has no
more elements and copying the remaining elements
from the other sublist.
Merge Function Logic and Implementation

 The merge function in merge sort uses a loop to iterate


through both sublists and compare the elements.
 The logic for merging the sublists involves keeping track
of the indices for both sublists, as well as a index for the
merged array.
Merge Function Loop Conditions

 The loop in the merge function should continue until one


of the sublists has been completely merged into the
merged array.
 The loop conditions can be implemented by checking
whether the index for one of the sublists has reached
the end of the sublist.

[Link] Function in Merge Sort


The concept of merge function in merge sort!
First, let's define what merge sort is. Merge sort is a
divide-and-conquer algorithm that splits a given array into
two halves, sorts them, and then merges them back
together in sorted order. The merge function is a crucial
part of this algorithm as it is responsible for merging the
two sorted halves.

Here's an example of how the merge function works, using


the array [38, 27, 43, 3, 9, 82, 10]:

1. We start by dividing the array into two halves: [38, 27, 43,
3] and [9, 82, 10].
2. We then sort each half: [27, 38, 3, 43] and [9, 10, 82].
3. Finally, we merge the two halves back together in sorted
order: [3, 9, 10, 27, 38, 43, 82].
So, how does the merge function accomplish this? Here's a
step-by-step breakdown:

1. The merge function takes in two arrays, left and right ,


which are the two halves to be merged. It also takes in
the result array, which will hold the final, merged array.

2. We initialize three pointers: i , j , and k . i and j point


to the first elements of left and right , respectively,
while k points to the first empty spot in result .

3. We then compare the first elements of left and right .


Whichever one is smaller gets added to result at the
position pointed to by k , and we increment that pointer
accordingly.
4. We continue comparing and adding elements
from left and right to result in this manner, until we
run out of elements in one of the arrays.
5. At this point, all that's left are the remaining elements
from the other array, so we simply add those to result .

6. And that's it! We now have a single, sorted array


in result .

Here's some sample code for the merge function:

def merge(left, right, result):


i = j = k = 0

while i < len(left) and j < len(right):


if left[i] <= right[j]:
result[k] = left[i]
i += 1
else:
result[k] = right[j]
j += 1

k += 1

while i < len(left):


result[k] = left[i]
i += 1
k += 1

while j < len(right):


result[k] = right[j]
j += 1
k += 1
One thing to note is that the merge function is not a
recursive function, unlike the merge sort algorithm itself.
Instead, it is a helper function that is called by the merge
sort function to actually perform the merging of the two
halves.

In terms of quotes or anecdotes, I don't have any specific


ones related to the merge function itself. However, I will
say that merge sort is often considered one of the most
intuitive and easy-to-understand sorting algorithms, due in
large part to the simplicity of the merge function.

And that's it for the merge function in merge sort! I hope


this summary has been helpful. Let me know if you have
any questions or if there's anything else I can help with.

[Link] Call in Merge Sort


In this chapter, we will delve into the concept of recursive
call in the merge sort algorithm. Let's start with an
example to understand the concept better.

Imagine you have a deck of cards, and you want to sort


them by suit and then by rank. A simple approach would
be to divide the deck into two halves, sort each half, and
then merge the two

sorted halves back together. This is the basic idea behind


merge sort.

Now, let's take a closer look at the recursive call in merge


sort. The merge sort algorithm is a divide-and-conquer
approach, which means it divides the input into smaller
pieces, solves each piece independently, and then merges
the solutions back together. The recursive call comes into
play when dividing the input.

Here's a step-by-step calculation of the merge sort


algorithm on an example input array [5, 3, 8, 4]:

1. Divide the input array into two halves: [5, 3] and [8, 4].
2. Divide each half further into two halves: [5] and [3], [8]
and [4].
3. Since each half has only one element, they are already
sorted.
4. Merge each pair of sorted halves: [5, 3] and [8, 4].
5. Finally, merge the two sorted halves from step 4: [5, 3, 8,
4].
The recursive call is used in step 1 to divide the input
array into two halves. The divide step is implemented as
follows:

def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)

In this code, merge_sort is a recursive function that


takes an input array arr and returns a sorted version of
it. If the length of arr is less than or equal to 1, the
function returns arr as it is already sorted. If the length
of arr is greater than 1, the function divides arr into
two halves at index mid , recursively sorts each half
using merge_sort , and then merges the sorted halves
using the merge function.

As an anecdote, the merge sort algorithm was developed


in the 1940s by John von Neumann and Herman Goldstine
for sorting punched card data used in early computing.
The recursive call in merge sort made it possible to
efficiently sort large datasets, which was a significant
achievement at the time.

In the recursive call in merge sort plays a crucial role in


efficiently sorting large datasets by dividing the input into
smaller pieces, solving each piece independently, and
then merging the solutions back together. The step-by-
step calculation and code sample demonstrate how the
recursive call is used in practice.

[Link] Complexity in Merge


Function
In this chapter, we will be discussing the time complexity
of the merge function, which is a crucial part of the merge
sort algorithm. The merge function is responsible for
combining two sorted arrays into a single sorted array.

To begin, let's consider the best-case scenario for the


merge function, where the two arrays being merged are
already sorted. In this case, the time complexity of the
merge function is O(n), where n is the number of elements
in the arrays. This is because, in the best case, the merge
function only needs to iterate through the arrays once to
combine them.

For example, let's say we have two arrays, A = [1, 3, 5]


and B = [2, 4, 6], and we want to merge them using the
merge function. In this case, the merge function would
only need to iterate through the arrays once, comparing
and swapping elements as necessary, to produce the
merged array [1, 2, 3, 4, 5, 6].

However, in the worst-case scenario, the two arrays being


merged are not sorted, and the merge function must
iterate through the arrays multiple times to combine
them. In this case, the time complexity of the merge
function is O(n + m), where n and m are the number of
elements in the arrays.

For example, let's say we have two arrays, A = [5, 3, 1]


and B = [6, 4, 2], and we want to merge them using the
merge function. In this case, the merge function would
need to iterate through the arrays multiple times,
comparing and swapping elements, to produce the
merged array [1, 2, 3, 4, 5, 6].

It's important to note that the time complexity of the


merge function is directly related to the number of
elements in the arrays being merged. This means that as
the size of the arrays increases, the time complexity of the
merge function also increases.

To visualize this, imagine two arrays, A and B, each with n


elements. In the best case, where the arrays are already
sorted, the merge function will take n actions to merge
them. However, in the worst case, where the arrays are
not sorted, the merge function will take n + m actions to
merge them.

Here is a hand-drawn plot that illustrates the time


complexity of the merge function in both the best and
worst case scenarios:

Best Case: Worst Case:


+-------------+ +-------------+
| n | | n + m |
+-------------+ +-------------+
In the time complexity of the merge function is an
important consideration when implementing merge sort. In
the best case, where the arrays being merged are already
sorted, the time complexity is O(n). However, in the worst
case, where the arrays are not sorted, the time complexity
is O(n + m). This means that as the size of the arrays
increases, the time complexity of the merge function also
increases.

Code Sample:

function merge(arr1, arr2) {


let result = [];
let i = 0;
let j = 0;

while (i < [Link] && j < [Link]) {


if (arr1[i] < arr2[j]) {
[Link](arr1[i]);
i++;
} else {
[Link](arr2[j]);
j++;
}
}

return
[Link]([Link](i)).concat([Link](j
));
}
It's worth to mention that the above code sample is not
the most optimized version of the merge function, it's
presented as a simple example.

In this example, we can see the while loop that run


until i or j reaches the end of the array, for each
iteration we compare the elements at i and j and push
the smallest one to the result array, then increment the
index of the array we picked the element from.

In the end, we concatenate the remaining elements of the


arrays that were not processed in the while loop.

Another worth to mention thing is that, if the input arrays


are already sorted, the code sample above will still take
O(n+m) time to merge both arrays, as it will take the
same number of iteration to compare elements and push
them to the result array.

This is why it's important to take into account the time


complexity of the merge function, as in the case where the
input arrays are already sorted, it will be O(n+m) while it
could be O(n) if you optimize it.

[Link] Sort Example


Walkthrough
Merge Sort example walkthrough in a human-level, pro-
fluent way. Let's dive in!

Merge Sort is a divide-and-conquer algorithm used for


sorting arrays. It works by dividing the input array into two
halves, sorting each half, and then merging the sorted
halves back together. This process is repeated recursively
until the base case is reached, which is when the array
has only one element (since a single-element array is
already sorted).

Here are the main steps involved in Merge Sort:

1. Divide: Divide the input array into two halves. This is


typically done by finding the middle index of the array and
splitting it into two sub-arrays.
Example: If the input array is [5, 3, 8, 4, 9, 1] , then
the middle index is 3 , so the two halves are [5,
3] and [8, 4, 9, 1] .

2. Conquer: Sort each half by recursively applying the


Merge Sort algorithm.
Example: [5, 3] is already sorted, and [8, 4, 9,
1] can be sorted using Merge Sort to become [4, 8, 9,
1] .

3. Merge: Merge the two sorted halves back together into a


single sorted array.
Example: To merge [5, 3] and [4, 8, 9, 1] , we first
compare the smallest elements of each half. In this
case, 3 from [5, 3] is smaller than 4 from [4, 8, 9,
1] , so we add 3 to the merged array. Then, we
compare 5 from [5, 3] to 4 from [4, 8, 9, 1] .
Since 4 is smaller than 5 , we add 4 to the merged
array. This process continues until both halves have been
merged.

The resulting merged array is [3, 4, 5, 8, 9, 1] ,


which is sorted.

Here's some Python code to illustrate the Merge Sort


algorithm:

def merge_sort(arr):
if len(arr) <= 1:
return arr

mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
left_half = merge_sort(left_half)
right_half = merge_sort(right_half)

return merge(left_half, right_half)

def merge(left, right):


result = []
i = j = 0

while i < len(left) and j < len(right):


if left[i] < right[j]:
[Link](left[i])
i += 1
else:
[Link](right[j])
j += 1

[Link](left[i:])
[Link](right[j:])

return result
In terms of performance, Merge Sort has a time
complexity of O(n log n) in the average and worst cases,
making it a very efficient sorting algorithm for large
arrays.

You might also like