合并排序

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

合并排序技术的复杂性

  • 时间复杂度: 所有情况下为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

以上是 合并排序 的全部内容, 来源链接: utcz.com/z/345500.html

回到顶部