归并排序是一种基于“分而治之”技术的排序算法。它是最有效的排序算法之一。
在本文中,您将了解归并排序算法的工作原理、归并排序算法、它的时间和空间复杂度,以及它在 C++、Python 和 Java 等各种编程语言中的实现。
归并排序(Merge Sort)算法如何工作?
归并排序的工作原理是分而治之。合并排序重复地将一个数组分解为两个相等的子数组,直到每个子数组包含一个元素。最后,合并所有这些子数组,以便对结果数组进行排序。
借助示例可以更有效地解释这个概念。考虑具有以下元素的未排序数组:{16, 12, 15, 13, 19, 17, 11, 18}。

在这里,归并排序算法将数组分成两半,为这两半调用自身,然后将排序后的两半合并。
归并排序算法
下面是归并排序的算法:
MergeSort(arr[],leftIndex, rightIndex)
ifleftIndex >= rightIndex
return
else
Findthe middle index that divides the array into two halves:
middleIndex= leftIndex + (rightIndex-leftIndex)/2
CallmergeSort for the first half:
CallmergeSort(arr, leftIndex, middleIndex)
CallmergeSort for the second half:
CallmergeSort(arr, middleIndex+1, rightIndex)
Mergethe two halves sorted in step 2 and 3:
Callmerge(arr, leftIndex, middleIndex, rightIndex)
归并排序算法的时空复杂度
归并排序算法可以表示为以下递推关系的形式:
T(n) = 2T(n/2) + O(n)
使用主定理或递归树方法求解此递归关系后,您将得到 O(n logn) 的解。因此,归并排序算法的时间复杂度为 O(n logn)。
合并排序的最佳情况时间复杂度:O(n logn)
归并排序的平均时间复杂度:O(n logn)
归并排序的最坏情况时间复杂度:O(n logn)
归并排序算法 的辅助空间复杂度为O(n),因为在归并排序实现中需要 n 个辅助空间。
归并排序算法的 C++ 实现
下面是归并排序算法的 C++ 实现:
// C++ implementation of the
// merge sort algorithm
# include<iostream>
usingnamespacestd;
// This function merges two subarrays of arr[]
// Left subarray: arr[leftIndex..middleIndex]
// Right subarray: arr[middleIndex+1..rightIndex]
voidmerge( intarr[], intleftIndex, intmiddleIndex, intrightIndex)
{
intleftSubarraySize = middleIndex - leftIndex + 1;
intrightSubarraySize = rightIndex - middleIndex;
// Create temporary arrays
intL[leftSubarraySize], R[rightSubarraySize];
// Copying data to temporary arrays L[] and R[]
for( inti = 0; i < leftSubarraySize; i++)
L[i] = arr[leftIndex + i];
for( intj = 0; j < rightSubarraySize; j++)
R[j] = arr[middleIndex + 1+ j];
// Merge the temporary arrays back into arr[leftIndex..rightIndex]
// Initial index of Left subarray
inti = 0;
// Initial index of Right subarray
intj = 0;
// Initial index of merged subarray
intk = leftIndex;
while(i < leftSubarraySize && j < rightSubarraySize)
{
if(L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
// If there're some remaining elements in L[]
// Copy to arr[]
while(i < leftSubarraySize)
{
arr[k] = L[i];
i++;
k++;
}
// If there're some remaining elements in R[]
// Copy to arr[]
while(j < rightSubarraySize)
{
arr[k] = R[j];
j++;
k++;
}
}
voidmergeSort( intarr[], intleftIndex, intrightIndex)
{
if(leftIndex >= rightIndex)
{
return;
}
intmiddleIndex = leftIndex + (rightIndex - leftIndex)/ 2;
mergeSort(arr, leftIndex, middleIndex);
mergeSort(arr, middleIndex+ 1, rightIndex);
merge(arr, leftIndex, middleIndex, rightIndex);
}
// Function to print the elements// of the arrayvoidprintArray( intarr[], intsize) {for( inti = 0; i < size; i++) {cout<< arr[i] << " "; }cout<< endl; }// Driver codeintmain{intarr[] = { 16, 12, 15, 13, 19, 17, 11, 18}; intsize = sizeof(arr) / sizeof(arr[ 0]); cout<< "Unsorted array:"<< endl; printArray(arr, size);mergeSort(arr, 0, size - 1); cout<< "Sorted array:"<< endl; printArray(arr, size);return0; }
输出:
Unsortedarray:1612 15 13 19 17 11 18 Sortedarray:1112 13 15 16 17 18 19![]()
归并排序算法的 Java 实现
下面是合并排序算法的 Java 实现:
// Java implementation of the// merge sort algorithm// This function merges two subarrays of arr[]// Left subarray: arr[leftIndex..middleIndex]// Right subarray: arr[middleIndex+1..rightIndex]functionmerge( arr, leftIndex, middleIndex, rightIndex) { letleftSubarraySize = middleIndex - leftIndex + 1; letrightSubarraySize = rightIndex - middleIndex; // Create temporary arraysvarL = newArray(leftSubarraySize); varR = newArray(rightSubarraySize); // Copying data to temporary arrays L[] and R[]for( leti = 0; i<leftSubarraySize; i++) { L[i] = arr[leftIndex + i];}for( letj = 0; j<rightSubarraySize; j++) { R[j] = arr[middleIndex + 1+ j]; }// Merge the temporary arrays back into arr[leftIndex..rightIndex]// Initial index of Left subarrayvari = 0; // Initial index of Right subarrayvarj = 0; // Initial index of merged subarrayvark = leftIndex; while(i < leftSubarraySize && j < rightSubarraySize) {if(L[i] <= R[j]) {arr[k] = L[i];i++;}else{arr[k] = R[j];j++;}k++;}// If there're some remaining elements in L[]// Copy to arr[]while(i < leftSubarraySize) {arr[k] = L[i];i++;k++;}// If there're some remaining elements in R[]// Copy to arr[]while(j < rightSubarraySize) {arr[k] = R[j];j++;k++;}}functionmergeSort( arr, leftIndex, rightIndex) { if(leftIndex >= rightIndex) { return}varmiddleIndex = leftIndex + parseInt((rightIndex - leftIndex)/ 2); mergeSort(arr, leftIndex, middleIndex);mergeSort(arr, middleIndex+ 1, rightIndex); merge(arr, leftIndex, middleIndex, rightIndex);}// Function to print the elements// of the arrayfunctionprintArray( arr, size) { for( leti = 0; i<size; i++) { document.write(arr[i] + " "); }document.write( "<br>"); }// Driver code:vararr = [ 16, 12, 15, 13, 19, 17, 11, 18]; varsize = arr.length; document.write( "Unsorted array:<br>"); printArray(arr, size);mergeSort(arr, 0, size - 1); document.write( "Sorted array:<br>"); printArray(arr, size);输出:
Unsortedarray:1612 15 13 19 17 11 18Sortedarray:1112 13 15 16 17 18 19归并排序算法的 Python 实现
下面是归并排序算法的 Python 实现:
# Python implementation of the# merge sort algorithmdefmergeSort(arr):iflen(arr) > 1:# Finding the middle index of the arraymiddleIndex= len(arr)//2# Left half of the arrayL= arr[:middleIndex]# Right half of the arrayR= arr[middleIndex:]# Sorting the first half of the arraymergeSort(L)# Sorting the second half of the arraymergeSort(R)# Initial index of Left subarrayi= 0# Initial index of Right subarrayj= 0# Initial index of merged subarrayk= 0# Copy data to temp arrays L[] and R[]whilei < len(L) and j < len(R):ifL[i] < R[j]:arr[k]= L[i]i= i + 1else: arr[k]= R[j]j= j + 1k= k + 1# Checking if there're some remaining elementswhilei < len(L):arr[k]= L[i]i= i + 1k= k + 1whilej < len(R):arr[k]= R[j]j= j + 1k= k + 1# Function to print the elements# of the arraydefprintArray(arr, size):fori in range(size):print(arr[i],end=" ")print# Driver codearr= [ 16, 12, 15, 13, 19, 17, 11, 18 ]size= len(arr)print("Unsortedarray:")printArray(arr,size)mergeSort(arr)print("Sortedarray:")printArray(arr,size)
输出:
Unsortedarray:1612 15 13 19 17 11 18Sortedarray:1112 13 15 16 17 18 19![]()
了解其他排序算法
排序是编程中最常用的算法之一。您可以使用各种排序算法(如快速排序、冒泡排序、归并排序、插入排序等)对不同编程语言中的元素进行排序。
如果您想了解最简单的排序算法,冒泡排序是最佳选择。
来自:Linux迷
链接:https://www.linuxmi.com/merge-sort-python-c.html
关注我们
Linux公社
关注 Linux公社,添加“星标 ”
每天 获取 技术干货,让我们一起成长
合作联系: root@linuxidc.net返回搜狐,查看更多