当前位置: 首页 > 编程笔记 >

合并排序

徐景明
2023-03-14
本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下

合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。

合并排序技术的复杂性

  • 时间复杂度: 所有情况下为O(n log n)

  • 空间复杂度:  O(n)

输入输出

Input:
The unsorted list: 14 20 78 98 20 45
Output:
Array before Sorting: 14 20 78 98 20 45
Array after Sorting: 14 20 20 45 78 98

算法

合并(数组,左,中,右)

输入- 数据集数组,左,中和右索引

输出- 合并列表

Begin
   nLeft := m - left+1
   nRight := right – m
   define arrays leftArr and rightArr of size nLeft and nRight respectively

   for i := 0 to nLeft do
      leftArr[i] := array[left +1]
   done

   for j := 0 to nRight do
      rightArr[j] := array[middle + j +1]
   done

   i := 0, j := 0, k := left
   while i < nLeft AND j < nRight do
      if leftArr[i] <= rightArr[j] then
         array[k] = leftArr[i]
         i := i+1
      else
         array[k] = rightArr[j]
         j := j+1
      k := k+1
   done

   while i < nLeft do
      array[k] := leftArr[i]
      i := i+1
      k := k+1
   done

   while j < nRight do
      array[k] := rightArr[j]
      j := j+1
      k := k+1
   done
End

mergeSort(array,left,right)

输入- 数据数组以及数组的上下限

输出- 排序的数组

Begin
   if lower < right then
      mid := left + (right - left) /2
      mergeSort(array, left, mid)
      mergeSort (array, mid+1, right)
      merge(array, left, mid, right)
End

示例

#include<iostream>
using namespace std;

void swapping(int &a, int &b) { //swap the content of a and b
   int temp;
   temp = a;
   a = b;
   b = temp;
}

void display(int *array, int size) {
   for(int i = 0; i<size; i++)
      cout << array[i] << " ";
   cout << endl;
}

void merge(int *array, int l, int m, int r) {
   int i, j, k, nl, nr;
   //左右子数组的大小
   nl = m-l+1; nr = r-m;
   int larr[nl], rarr[nr];

   //填充左右子数组
   for(i = 0; i<nl; i++)
      larr[i] = array[l+i];
   for(j = 0; j<nr; j++)
      rarr[j] = array[m+1+j];

   i = 0; j = 0; k = l;
   //将临时数组转换为实数组

   while(i < nl && j<nr) {
      if(larr[i] <= rarr[j]) {
         array[k] = larr[i];
         i++;
      }else{
         array[k] = rarr[j];
         j++;
      }
      k++;
   }

   while(i<nl) {       //extra element in left array
      array[k] = larr[i];
      i++; k++;
   }

   while(j<nr) {      //extra element in right array
      array[k] = rarr[j];
      j++; k++;
   }
}

void mergeSort(int *array, int l, int r) {
   int m;
   if(l < r) {
      int m = l+(r-l)/2;
      //排序第一和第二个数组
      mergeSort(array, l, m);
      mergeSort(array, m+1, r);
      merge(array, l, m, r);
   }
}

int main() {
   int n;
   cout << "Enter the number of elements: ";
   cin >> n;
   int arr[n]; //create an array with given number of elements
   cout << "输入元素:" << endl;

   for(int i = 0; i<n; i++) {
      cin >> arr[i];
   }

   cout << "Array before Sorting: ";
   display(arr, n);
   mergeSort(arr, 0, n-1); //(n-1) for last index
   cout << "Array after Sorting: ";
   display(arr, n);
}

输出结果

Enter the number of elements: 6
输入元素:
14 20 78 98 20 45
Array before Sorting: 14 20 78 98 20 45
Array after Sorting: 14 20 20 45 78 98
 类似资料:
  • 双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并

  • 本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本:            

  • 我知道合并排序算法的基本概念,但是当涉及到通过递归实现它时,我很难理解它是如何工作的。据我所知,合并排序函数将我们当前的数组分成两半,并使用递归我们一直这样做,直到每边只剩下一个元素。 如果我们的数组是{38、27、43、3、9、82、10},那么我们的递归将从使用子数组(原始数组的左侧)调用自身开始,并每次重复该过程,将数组减半并存储最左侧,直到达到1个元素: 然后在我们的第二个子例程中,我们继

  • 这些是家庭作业问题,但我想了解它们背后的概念,而不仅仅是得到答案。 我知道MergeSort的运行时间是O(nlogn)。似乎合并方法必须运行 n 次(因为它必须合并所有数组,最终会有 n 个数组)。因此,我想我可以推断出 MergeSort() 方法将被称为 logn times。我也认为这是有道理的,因为它正在划分数组,所以它会一直将自己除以 2,所以 logn。 因此,我觉得答案分别是C和A

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。

  • 合并排序是一种基于分而治之技术的排序技术。 在最坏情况下的时间复杂度为0(n log n)时,它是最受尊敬的算法之一。 合并排序首先将数组分成相等的一半,然后以排序的方式组合它们。 合并排序如何工作? 要理解合并排序,我们采用未排序的数组,如下所示 - 我们知道,除非实现原子值,否则合并排序首先将整个数组迭代地分成相等的一半。 我们在这里看到,8个项目的数组被分成两个大小为4的数组。 这不会改变原