社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

C++ 与 Python 使用归并排序对数组进行排序的全新方法

Linux公社 • 2 年前 • 219 次点击  

点击上方蓝字 ● 关注Linux公社     

归并排序是一种基于“分而治之”技术的排序算法。它是最有效的排序算法之一。
在本文中,您将了解归并排序算法的工作原理、归并排序算法、它的时间和空间复杂度,以及它在 C++、Python 和 JavaScript 等各种编程语言中的实现。

归并排序(Merge Sort)算法如何工作?

归并排序的工作原理是分而治之。合并排序重复地将一个数组分解为两个相等的子数组,直到每个子数组包含一个元素。最后,合并所有这些子数组,以便对结果数组进行排序。
借助示例可以更有效地解释这个概念。考虑具有以下元素的未排序数组:{16, 12, 15, 13, 19, 17, 11, 18}。
在这里,归并排序算法将数组分成两半,为这两半调用自身,然后将排序后的两半合并。

归并排序算法

下面是归并排序的算法:
MergeSort(arr[], leftIndex, rightIndex)if leftIndex >= rightIndex     returnelse     Find the middle index that divides the array into two halves:               middleIndex = leftIndex + (rightIndex-leftIndex)/2     Call mergeSort() for the first half:                Call mergeSort(arr, leftIndex, middleIndex)     Call mergeSort() for the second half:             Call mergeSort(arr, middleIndex+1, rightIndex)     Merge the two halves sorted in step 2 and 3:             Call merge(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 using namespace std;// This function merges two subarrays of arr[]// Left subarray: arr[leftIndex..middleIndex]// Right subarray: arr[middleIndex+1..rightIndex]void merge(int arr[], int leftIndex, int middleIndex, int rightIndex){ int leftSubarraySize = middleIndex - leftIndex + 1; int rightSubarraySize = rightIndex - middleIndex;// Create temporary arrays int L[leftSubarraySize], R[rightSubarraySize];// Copying data to temporary arrays L[] and R[] for (int i = 0; i < leftSubarraySize; i++) L[i] = arr[leftIndex + i];


    
 for (int j = 0; j < rightSubarraySize; j++) R[j] = arr[middleIndex + 1 + j];// Merge the temporary arrays back into arr[leftIndex..rightIndex]// Initial index of Left subarray int i = 0;// Initial index of Right subarray int j = 0;// Initial index of merged subarray int k = 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++; }}void mergeSort(int arr[], int leftIndex, int rightIndex){ if(leftIndex >= rightIndex) { return; } int middleIndex = 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 arrayvoid printArray(int arr[], int size){ for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl;}// Driver codeint main(){ int arr[] = { 16, 12, 15, 13, 19, 17, 11, 18 }; int size = sizeof(arr) / sizeof(arr[0]);cout << "Unsorted array:" << endl; printArray(arr, size);mergeSort(arr, 0, size - 1);cout << "Sorted array:" << endl; printArray(arr, size);return 0;}
输出:
Unsorted array:16 12 15 13 19 17 11 18 Sorted array:11 12 13 15 16 17 18 19

归并排序算法的 JavaScript 实现

下面是合并排序算法的 JavaScript 实现:
// JavaScript implementation of the// merge sort algorithm// This function merges two subarrays of arr[]// Left subarray: arr[leftIndex..middleIndex]// Right subarray: arr[middleIndex+1..rightIndex]function merge(arr, leftIndex, middleIndex, rightIndex) { let leftSubarraySize = middleIndex - leftIndex + 1; let rightSubarraySize = rightIndex - middleIndex;// Create temporary arrays var L = new Array(leftSubarraySize); var R = new Array(rightSubarraySize);// Copying data to temporary arrays L[] and R[] for(let i = 0; i L[i] = arr[leftIndex + i]; } for (let j = 0; j R[j] = arr[middleIndex + 1 + j]; }// Merge the temporary arrays back into arr[leftIndex..rightIndex]// Initial index of Left subarray var i = 0;// Initial index of Right subarray var j = 0;// Initial index of merged subarray var k = 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++; }}function mergeSort(arr, leftIndex, rightIndex) { if(leftIndex >= rightIndex) { return } var middleIndex = 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 arrayfunction printArray(arr, size) { for(let i = 0; i document.write(arr[i] + " "); } document.write("
"
);
}// Driver code:var arr = [ 16, 12, 15, 13, 19, 17, 11, 18 ];var size = arr.length;document .write("Unsorted array:
"
);
printArray(arr, size);mergeSort(arr, 0, size - 1);document.write("Sorted array:
"
);
printArray(arr, size);
输出:
Unsorted array:16 12 15 13 19 17 11 18Sorted array:11 12 13 15 16 17 18 19

归并排序算法的 Python 实现

下面是归并排序算法的 Python 实现:
# Python implementation of the# merge sort algorithmdef mergeSort(arr):    if len(arr) > 1:        # Finding the middle index of the array        middleIndex = len(arr)//2        # Left half of the array        L = arr[:middleIndex]        # Right half of the array        R = arr[middleIndex:]        # Sorting the first half of the array        mergeSort(L)        # Sorting the second half of the array        mergeSort(R)        # Initial index of Left subarray        i = 0        # Initial index of Right subarray        j = 0        # Initial index of merged subarray        k = 0        # Copy data to temp arrays L[] and R[]        while i < len(L) and j < len(R):            if L[i] < R[j]:                arr[k] = L[i]                i = i + 1            else:                arr[k] = R[j]                j = j + 1            k = k + 1        # Checking if there're some remaining elements        while i < len(L):            arr[k] = L[i]            i = i + 1            k = k + 1        while j < len(R):            arr[k] = R[j]            j = j + 1            k = k + 1# Function to print the elements# of the arraydef printArray(arr, size):    for i in range(size):        print(arr[i], end=" ")    print()
# Driver codearr = [ 16, 12, 15, 13, 19, 17, 11, 18 ]size = len(arr)print("Unsorted array:")printArray(arr, size)mergeSort(arr)print("Sorted array:")printArray(arr, size)
输出:
Unsorted array:16 12 15 13 19 17 11 18Sorted array:11 12 13 15 16 17 18 19

了解其他排序算法

排序是编程中最常用的算法之一。您可以使用各种排序算法(如快速排序、冒泡排序、归并排序、插入排序等)对不同编程语言中的元素进行排序。
如果您想了解最简单的排序算法,冒泡排序是最佳选择。
来自:Linux迷
链接:https://www.linuxmi.com/merge-sort-python-c.html
关注我们

长按或扫描下面二维码关注 Linux公社



关注 Linux公社,添加“ 星标

每天 获取 技术干货,让我们一起成长

合作联系: root@linuxidc.net

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/147456
 
219 次点击