迭代合并排序

下面是一个典型的递归实现 合并排序

null

C++

// Recursive C++ program for merge sort
#include<bits/stdc++.h>
using namespace std;
// Function to merge the two haves
// arr[l..m] and arr[m+1..r] of array arr[]
void merge( int arr[], int l, int m, int r);
// l is for left index and r is
// right index of the sub-array
// of arr to be sorted
void mergeSort( int arr[], int l, int r)
{
if (l < r)
{
// Same as (l+r)/2 but avoids
// overflow for large l & h
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
// Function to merge the two haves arr[l..m]
// and arr[m+1..r] of array arr[]
void merge( int arr[], int l, int m, int r)
{
int 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 ( int i = 0; i < n1; i++)
L[i] = arr[l + i];
for ( int j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
// Merge the temp arrays
// back into arr[l..r]
int i = 0;
int j = 0;
k = l;
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++;
}
}
// Function to print an array
void printArray( int A[], int size)
{
for ( int i = 0; i < size; i++)
printf ( "%d " , A[i]);
cout << "" ;
}
// Driver code
int main()
{
int arr[] = { 12, 11, 13, 5, 6, 7 };
int arr_size = sizeof (arr) / sizeof (arr[0]);
cout << "Given array is " ;
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
cout << "Sorted array is " ;
printArray(arr, arr_size);
return 0;
}
// This code is contributed by Mayank Tyagi


C

/* Recursive C program for merge sort */
#include<stdlib.h>
#include<stdio.h>
/* Function to merge the two haves
arr[l..m] and arr[m+1..r] of array arr[] */
void merge( int arr[], int l, int m, int r);
/* l is for left index and r is
right index of the sub-array
of arr to be sorted */
void mergeSort( int arr[], int l, int r)
{
if (l < r)
{
// Same as (l+r)/2 but avoids
// overflow for large l & h
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
/* Function to merge the two haves arr[l..m]
and arr[m+1..r] of array arr[] */
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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
void printArray( int A[], int size)
{
int i;
for (i=0; i < size; i++)
printf ( "%d " , A[i]);
printf ( "" );
}
/* Driver program to test above functions */
int main()
{
int arr[] = {12, 11, 13, 5, 6, 7};
int arr_size = sizeof (arr)/ sizeof (arr[0]);
printf ( "Given array is " );
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
printf ( "Sorted array is " );
printArray(arr, arr_size);
return 0;
}


JAVA

// Recursive Java Program for merge sort
import java.util.Arrays;
public class GFG
{
public static void mergeSort( int [] array)
{
if (array == null )
{
return ;
}
if (array.length > 1 )
{
int mid = array.length / 2 ;
// Split left part
int [] left = new int [mid];
for ( int i = 0 ; i < mid; i++)
{
left[i] = array[i];
}
// Split right part
int [] right = new int [array.length - mid];
for ( int i = mid; i < array.length; i++)
{
right[i - mid] = array[i];
}
mergeSort(left);
mergeSort(right);
int i = 0 ;
int j = 0 ;
int k = 0 ;
// Merge left and right arrays
while (i < left.length && j < right.length)
{
if (left[i] < right[j])
{
array[k] = left[i];
i++;
}
else
{
array[k] = right[j];
j++;
}
k++;
}
// Collect remaining elements
while (i < left.length)
{
array[k] = left[i];
i++;
k++;
}
while (j < right.length)
{
array[k] = right[j];
j++;
k++;
}
}
}
// Driver program to test above functions.
public static void main(String[] args)
{
int arr[] = { 12 , 11 , 13 , 5 , 6 , 7 };
int i= 0 ;
System.out.println( "Given array is" );
for (i= 0 ; i<arr.length; i++)
System.out.print(arr[i]+ " " );
mergeSort(arr);
System.out.println( "" );
System.out.println( "Sorted array is" );
for (i= 0 ; i<arr.length; i++)
System.out.print(arr[i]+ " " );
}
}
// Code Contributed by Mohit Gupta_OMG


Python3

# Recursive Python Program for merge sort
def merge(left, right):
if not len (left) or not len (right):
return left or right
result = []
i, j = 0 , 0
while ( len (result) < len (left) + len (right)):
if left[i] < right[j]:
result.append(left[i])
i + = 1
else :
result.append(right[j])
j + = 1
if i = = len (left) or j = = len (right):
result.extend(left[i:] or right[j:])
break
return result
def mergesort( list ):
if len ( list ) < 2 :
return list
middle = int ( len ( list ) / 2 )
left = mergesort( list [:middle])
right = mergesort( list [middle:])
return merge(left, right)
seq = [ 12 , 11 , 13 , 5 , 6 , 7 ]
print ( "Given array is" )
print (seq);
print ( "" )
print ( "Sorted array is" )
print (mergesort(seq))
# Code Contributed by Mohit Gupta_OMG


C#

/* Iterative C# program for merge
sort */
using System;
class GFG {
/* l is for left index and r
is right index of the sub-array
of arr to be sorted */
static void mergeSort( int [] arr,
int l, int r)
{
if (l < r)
{
// Same as (l+r)/2 but avoids
// overflow for large l & h
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
/* Function to merge the two haves
arr[l..m] and arr[m+1..r] of array
arr[] */
static 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 = new int [n1];
int []R = new int [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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
static void printArray( int []A, int size)
{
int i;
for (i=0; i < size; i++)
Console.Write(A[i]+ " " );
Console.Write( "" );
}
/* Driver program to test above functions */
public static void Main()
{
int []arr = {12, 11, 13, 5, 6, 7};
int arr_size = arr.Length;
Console.Write( "Given array is " );
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
Console.Write( "Sorted array is " );
printArray(arr, arr_size);
}
}
// This code is contributed by Smitha


Javascript

<script>
// Recursive javascript Program for merge sort
function mergeSort(array) {
if (array == null ) {
return ;
}
if (array.length > 1) {
var mid = parseInt(array.length / 2);
// Split left part
var left = Array(mid).fill(0);
for (i = 0; i < mid; i++) {
left[i] = array[i];
}
// Split right part
var right = Array(array.length - mid).fill(0);
for (i = mid; i < array.length; i++) {
right[i - mid] = array[i];
}
mergeSort(left);
mergeSort(right);
var i = 0;
var j = 0;
var k = 0;
// Merge left and right arrays
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
array[k] = left[i];
i++;
} else {
array[k] = right[j];
j++;
}
k++;
}
// Collect remaining elements
while (i < left.length) {
array[k] = left[i];
i++;
k++;
}
while (j < right.length) {
array[k] = right[j];
j++;
k++;
}
}
}
// Driver program to test above functions.
var arr = [ 12, 11, 13, 5, 6, 7 ];
var i = 0;
document.write( "Given array is<br/>" );
for (i = 0; i < arr.length; i++)
document.write(arr[i] + " " );
mergeSort(arr);
document.write( "<br/><br/>" );
document.write( "Sorted array is<br/>" );
for (i = 0; i < arr.length; i++)
document.write(arr[i] + " " );
// This code is contributed by umadevi9616
</script>


输出:

Given array is12 11 13 5 6 7Sorted array is5 6 7 11 12 13

迭代合并排序: 上面的函数是递归的,所以使用 函数调用堆栈 存储l和h的中间值。函数调用堆栈将其他簿记信息与参数一起存储。此外,函数调用还涉及一些开销,比如存储调用方函数的激活记录,然后恢复执行。不像 迭代快速排序 ,迭代合并排序不需要显式的辅助堆栈。

注意:在迭代合并排序中,我们使用自下而上的方法,即从2个元素大小的数组开始(我们知道1个元素大小的数组已经排序)。另外,关键的一点是,由于我们不知道如何像自上而下的方法那样精确地划分数组,其中2个元素大小的数组可能是大小序列2,1,2,2,1…我们在自下而上的方法中,假设数组被2的幂(n/2,n/4…等)精确地划分为2的幂,例如:n=2,4,8,16。 因此,对于其他输入大小,例如5、7、11,我们将有剩余的子列表,在每个级别上没有进入2宽度的幂,因为我们继续合并并向上,这个未合并的子列表的大小不是2的精确幂,将保持孤立,直到最后的合并。 要在最终合并时合并此未合并列表,我们需要强制mid位于未合并列表的开头,以便它成为合并的候选对象。

未合并的子列表元素计数将被隔离,直到可以使用余数(n%宽度)找到最终合并调用为止。最后的合并(当我们有不均匀列表时)可以通过(宽度>n/2)来识别。

因为当宽度=n/2时,宽度以2的幂增长,这意味着输入的大小已经是2的幂,否则,如果宽度 n/2时,我们必须有待定的未合并不均匀列表,因此我们只在这种情况下重置mid。

上述函数可以很容易地转换为迭代版本。下面是迭代合并排序。

C++

/* Iterative C program for merge sort */
#include <bits/stdc++.h>
using namespace std;
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge( int arr[], int l, int m, int r);
// Utility function to find minimum of two integers
int min( int x, int y) { return (x<y)? x :y; }
/* Iterative mergesort function to sort arr[0...n-1] */
void mergeSort( int arr[], int n)
{
int curr_size; // For current size of subarrays to be merged
// curr_size varies from 1 to n/2
int left_start; // For picking starting index of left subarray
// to be merged
// Merge subarrays in bottom up manner.  First merge subarrays of
// size 1 to create sorted subarrays of size 2, then merge subarrays
// of size 2 to create sorted subarrays of size 4, and so on.
for (curr_size=1; curr_size<=n-1; curr_size = 2*curr_size)
{
// Pick starting point of different subarrays of current size
for (left_start=0; left_start<n-1; left_start += 2*curr_size)
{
// Find ending point of left subarray. mid+1 is starting
// point of right
int mid = min(left_start + curr_size - 1, n-1);
int right_end = min(left_start + 2*curr_size - 1, n-1);
// Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
void printArray( int A[], int size)
{
int i;
for (i=0; i < size; i++)
cout << " " << A[i];
cout << "" ;
}
/* Driver program to test above functions */
int main()
{
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "Given array is " ;
printArray(arr, n);
mergeSort(arr, n);
cout << "Sorted array is " ;
printArray(arr, n);
return 0;
}
// This code is contributed shivanisinghss2110


C

/* Iterative C program for merge sort */
#include<stdlib.h>
#include<stdio.h>
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge( int arr[], int l, int m, int r);
// Utility function to find minimum of two integers
int min( int x, int y) { return (x<y)? x :y; }
/* Iterative mergesort function to sort arr[0...n-1] */
void mergeSort( int arr[], int n)
{
int curr_size; // For current size of subarrays to be merged
// curr_size varies from 1 to n/2
int left_start; // For picking starting index of left subarray
// to be merged
// Merge subarrays in bottom up manner.  First merge subarrays of
// size 1 to create sorted subarrays of size 2, then merge subarrays
// of size 2 to create sorted subarrays of size 4, and so on.
for (curr_size=1; curr_size<=n-1; curr_size = 2*curr_size)
{
// Pick starting point of different subarrays of current size
for (left_start=0; left_start<n-1; left_start += 2*curr_size)
{
// Find ending point of left subarray. mid+1 is starting
// point of right
int mid = min(left_start + curr_size - 1, n-1);
int right_end = min(left_start + 2*curr_size - 1, n-1);
// Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
void printArray( int A[], int size)
{
int i;
for (i=0; i < size; i++)
printf ( "%d " , A[i]);
printf ( "" );
}
/* Driver program to test above functions */
int main()
{
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof (arr)/ sizeof (arr[0]);
printf ( "Given array is " );
printArray(arr, n);
mergeSort(arr, n);
printf ( "Sorted array is " );
printArray(arr, n);
return 0;
}


JAVA

/* Iterative Java program for merge sort */
import java.lang.Math.*;
class GFG {
/* Iterative mergesort function to sor
t arr[0...n-1] */
static void mergeSort( int arr[], int n)
{
// For current size of subarrays to
// be merged curr_size varies from
// 1 to n/2
int curr_size;
// For picking starting index of
// left subarray to be merged
int left_start;
// Merge subarrays in bottom up
// manner. First merge subarrays
// of size 1 to create sorted
// subarrays of size 2, then merge
// subarrays of size 2 to create
// sorted subarrays of size 4, and
// so on.
for (curr_size = 1 ; curr_size <= n- 1 ;
curr_size = 2 *curr_size)
{
// Pick starting point of different
// subarrays of current size
for (left_start = 0 ; left_start < n- 1 ;
left_start += 2 *curr_size)
{
// Find ending point of left
// subarray. mid+1 is starting
// point of right
int mid = Math.min(left_start + curr_size - 1 , n- 1 );
int right_end = Math.min(left_start
+ 2 *curr_size - 1 , n- 1 );
// Merge Subarrays arr[left_start...mid]
// & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
/* Function to merge the two haves arr[l..m] and
arr[m+1..r] of array arr[] */
static 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[] = new int [n1];
int R[] = new int [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 ;
j = 0 ;
k = l;
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++;
}
}
/* Function to print an array */
static void printArray( int A[], int size)
{
int i;
for (i= 0 ; i < size; i++)
System.out.printf( "%d " , A[i]);
System.out.printf( "" );
}
/* Driver program to test above functions */
public static void main(String[] args)
{
int arr[] = { 12 , 11 , 13 , 5 , 6 , 7 };
int n = arr.length;
System.out.printf( "Given array is " );
printArray(arr, n);
mergeSort(arr, n);
System.out.printf( "Sorted array is " );
printArray(arr, n);
}
}
// This code is contributed by Smitha


Python3

# Iterative Merge sort (Bottom Up)
# Iterative mergesort function to
# sort arr[0...n-1]
# perform bottom up merge
def mergeSort(a):
# start with least partition size of 2^0 = 1
width = 1
n = len (a)
# subarray size grows by powers of 2
# since growth of loop condition is exponential,
# time consumed is logarithmic (log2n)
while (width < n):
# always start from leftmost
l = 0 ;
while (l < n):
r = min (l + (width * 2 - 1 ), n - 1 )
m = min (l + width - 1 ,n - 1 )
# final merge should consider
# unmerged sublist if input arr
# size is not power of 2
merge(a, l, m, r)
l + = width * 2
# Increasing sub array size by powers of 2
width * = 2
return a
# Merge Function
def merge(a, l, m, r):
n1 = m - l + 1
n2 = r - m
L = [ 0 ] * n1
R = [ 0 ] * n2
for i in range ( 0 , n1):
L[i] = a[l + i]
for i in range ( 0 , n2):
R[i] = a[m + i + 1 ]
i, j, k = 0 , 0 , l
while i < n1 and j < n2:
if L[i] < = R[j]:
a[k] = L[i]
i + = 1
else :
a[k] = R[j]
j + = 1
k + = 1
while i < n1:
a[k] = L[i]
i + = 1
k + = 1
while j < n2:
a[k] = R[j]
j + = 1
k + = 1
# Driver code
a = [ - 74 , 48 , - 20 , 2 , 10 , - 84 , - 5 , - 9 , 11 , - 24 , - 91 , 2 , - 71 , 64 , 63 , 80 , 28 , - 30 , - 58 , - 11 , - 44 , - 87 , - 22 , 54 , - 74 , - 10 , - 55 , - 28 , - 46 , 29 , 10 , 50 , - 72 , 34 , 26 , 25 , 8 , 51 , 13 , 30 , 35 , - 8 , 50 , 65 , - 6 , 16 , - 2 , 21 , - 78 , 35 , - 13 , 14 , 23 , - 3 , 26 , - 90 , 86 , 25 , - 56 , 91 , - 13 , 92 , - 25 , 37 , 57 , - 20 , - 69 , 98 , 95 , 45 , 47 , 29 , 86 , - 28 , 73 , - 44 , - 46 , 65 , - 84 , - 96 , - 24 , - 12 , 72 , - 68 , 93 , 57 , 92 , 52 , - 45 , - 2 , 85 , - 63 , 56 , 55 , 12 , - 85 , 77 , - 39 ]
print ( "Given array is " )
print (a)
mergeSort(a)
print ( "Sorted array is " )
print (a)
# Contributed by Madhur Chhangani [RCOEM]
# corrected and improved by @mahee96


C#

/* Iterative C# program for merge sort */
using System;
public class GFG {
/* Iterative mergesort function to sor
t arr[0...n-1] */
static void mergeSort( int []arr, int n)
{
// For current size of subarrays to
// be merged curr_size varies from
// 1 to n/2
int curr_size;
// For picking starting index of
// left subarray to be merged
int left_start;
// Merge subarrays in bottom up
// manner. First merge subarrays
// of size 1 to create sorted
// subarrays of size 2, then merge
// subarrays of size 2 to create
// sorted subarrays of size 4, and
// so on.
for (curr_size = 1; curr_size <= n-1;
curr_size = 2*curr_size)
{
// Pick starting point of different
// subarrays of current size
for (left_start = 0; left_start < n-1;
left_start += 2*curr_size)
{
// Find ending point of left
// subarray. mid+1 is starting
// point of right
int mid = Math.Min(left_start + curr_size - 1,n-1);
int right_end = Math.Min(left_start
+ 2*curr_size - 1, n-1);
// Merge Subarrays arr[left_start...mid]
// & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
/* Function to merge the two haves arr[l..m] and
arr[m+1..r] of array arr[] */
static 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 = new int [n1];
int []R = new int [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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
static void printArray( int []A, int size)
{
int i;
for (i=0; i < size; i++)
Console.Write(A[i]+ " " );
Console.WriteLine( "" );
}
/* Driver program to test above functions */
public static void Main()
{
int []arr = {-74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,-72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,92,52,-45,-2,85,-63,56,55,12,-85,77,-39};
int n = arr.Length;
Console.Write( "Given array is " );
printArray(arr, n);
mergeSort(arr, n);
Console.Write( "Sorted array is " );
printArray(arr, n);
}
}
// This code is contributed by Rajput-Ji


Javascript

<script>
/* Iterative javascript program for merge sort */
/*
* Iterative mergesort function to sor t arr[0...n-1]
*/
function mergeSort(arr , n) {
// For current size of subarrays to
// be merged curr_size varies from
// 1 to n/2
var curr_size;
// For picking starting index of
// left subarray to be merged
var left_start;
// Merge subarrays in bottom up
// manner. First merge subarrays
// of size 1 to create sorted
// subarrays of size 2, then merge
// subarrays of size 2 to create
// sorted subarrays of size 4, and
// so on.
for (curr_size = 1; curr_size <= n - 1; curr_size = 2 * curr_size) {
// Pick starting point of different
// subarrays of current size
for (left_start = 0; left_start < n - 1; left_start += 2 * curr_size) {
// Find ending point of left
// subarray. mid+1 is starting
// point of right
var mid = Math.min(left_start + curr_size - 1, n - 1);
var right_end = Math.min(left_start + 2 * curr_size - 1, n - 1);
// Merge Subarrays arr[left_start...mid]
// & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
/*
* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr
*/
function merge(arr , l , m , r) {
var i, j, k;
var n1 = m - l + 1;
var n2 = r - m;
/* create temp arrays */
var L = Array(n1).fill(0);
var R = Array(n2).fill(0);
/*
* 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;
j = 0;
k = l;
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++;
}
}
/* Function to print an array */
function printArray(A , size) {
var i;
for (i = 0; i < size; i++)
document.write( A[i]+ " " );
document.write( "<br/>" );
}
/* Driver program to test above functions */
var arr = [-74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,-72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,92,52,-45,-2,85,-63,56,55,12,-85,77,-39];
var n = arr.length;
document.write( "Given array is <br/>" );
printArray(arr, n);
mergeSort(arr, n);
document.write( "<br/>Sorted array is <br/>" );
printArray(arr, n);
// This code contributed by umadevi9616
</script>


输出:

Given array is12 11 13 5 6 7Sorted array is5 6 7 11 12 13

上述迭代函数的时间复杂度与递归函数相同,即Θ(nLogn)。

参考资料: http://csg.sph.umich.edu/abecasis/class/2006/615.09.pdf 本文由 希瓦姆·阿格拉瓦尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享