归并排序(C语言实现)

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。

它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
  例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程: 
  初始值 [49] [38] [65] [97] [76] [13] [27] 
  看成由长度为1的7个子序列组成 
  第一次合并之后 [38 49] [65 97] [13 76] [27] 
  看成由长度为1或2的4个子序列组成 
  第二次合并之后 [38 49 65 97] [13 27 76] 
  看成由长度为4或3的2个子序列组成 
  第三次合并之后 [13 27 38 49 65 76 97] 
  合并算法的核心操作就是将一维数组中前后相邻的两个两个有序序列合并成一个有序序列。合并算法也可以采用递归算法来实现,形式上较为简单,但实用性很差。合并算法的合并次数是一个非常重要的量,根据计算当数组中有3到4个元素时,合并次数是2次,当有5到8个元素时,合并次数是3次,当有9到16个元素时,合并次数是4次,按照这一规律,当有N个子序列时可以推断出合并的次数是X(2 >=N,符合此条件的最小那个X)。
  其时间复杂度为:O(nlogn).所需辅助存储空间为:O(n)
  归并算法如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R, int low, int m, int high)
{
    //将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
    int i = low, j = m + 1, p = 0;                //置初始值
    RecType *R1;                        //R1是局部向量
    R1 = (RecType *)malloc((high - low + 1)*sizeof(RecType));
    if (!R1)
    {
        return;                         //申请空间失败
    }

    while (i <= m&&j <= high)                //两子文件非空时取其小者输出到R1[p]上
    {
        R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];
    }

    while (i <= m)                         //若第1个子文件非空,则复制剩余记录到R1中
    {
        R1[p++] = R[i++];
    }
    while (j <= high)                      //若第2个子文件非空,则复制剩余记录到R1中
    {
        R1[p++] = R[j++];
    }

    for (p = 0, i = low; i <= high; p++, i++)
    {
        R[i] = R1[p];                     //归并完成后将结果复制回R[low..high]
    }
}

void MergeSort(RecType R[], int low, int high)
{
    //用分治法对R[low..high]进行二路归并排序
    int mid;
    if (low<high)
    {   //区间长度大于1
        mid = (low + high) / 2;               //分解
        MergeSort(R, low, mid);           //递归地对R[low..mid]排序
        MergeSort(R, mid + 1, high);        //递归地对R[mid+1..high]排序
        Merge(R, low, mid, high);          //组合,将两个有序区归并为一个有序区
    }
}
void main()
{
    int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; //这里对7个元素进行排序
    int low = 0, high = 6;                   //初始化low和high的值  

    printf("Before merge sort: \n");
    for (int i = low; i <= high; i++)
    {
        printf("%d ", a[i]);             //输出测试
    }
    printf("\n");

    MergeSort(a, low, high);

    printf("\n After merge sort: \n");
    for (int i = low; i <= high; i++)
    {
        printf("%d ", a[i]);             //输出测试
    }
    printf("\n");
}

实现归并排序;归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表,然后调用 Merger  对子表进行归并,使之成为有序表,例如有如下向量:

25,10,7,19,3,48,12,17,56,30,21

对此序列进行归并排序的步骤为:

时间: 2024-08-03 05:45:31

归并排序(C语言实现)的相关文章

排序(6)---------归并排序(C语言实现)

归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 归并操作的过程如下: (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置 (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 (4) 重复步骤3直到某一指针到达序列尾 (5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾 简单的说,就是将一个序列不断的进行

归并排序C语言实现

归并排序典型的分治策略的体现,时间复杂度是O(nlgn), 空间复杂度是O(n).属于稳定排序. 下面是C语言实现代码. #define MAX 10000000 //p, q, r是均是元素的下标 void merge(int A[], int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int * L = (int *)malloc(sizeof(int) * n1 + 1); int * R = (int *)malloc(

归并排序c语言

1 void mergeAdd(int arr[], int left, int mid, int right, int *temp){ 2 int i = left; 3 int j = mid + 1; 4 int k = left;//临时下标 5 while (i <= mid&&j <= right){ 6 if (arr[i] < arr[j]){ 7 temp[k++] = arr[i++]; 8 } 9 else{ 10 temp[k++] = arr[j

归并排序 java语言实现

package sort; import java.util.Random; public class MergeSort { @SuppressWarnings("unused") public boolean initTestArray(int[] testArray) {// 初始化testArray if (testArray == null) return false; Random random = new Random(); for (int i = 0; i <

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

常见的9种内部排序(C语言实现)

现在已经把常见的9种内部排序算法都用C语言实现了,为了方便自己和大家查看,就弄了这么一个类似于导航目录的东西. 一.冒泡排序 冒泡排序(C语言版) 二.选择排序 选择排序(C语言版) 三.直接插入排序 直接插入排序(C语言版) 四.希尔排序 希尔排序(C语言版) 五.归并排序 归并排序(C语言版) 六.基数排序 基数排序(C语言版) 七.快速排序 快速排序(C语言版) 八.计数排序 计数排序(C语言版) 九.堆排序 堆排序(C语言版) 介绍完这九个常用的排序算法,怎么能没有一个比较呢?下面是我对

排序算法(Java语言)——归并排序

归并排序mergesort中基本的操作是合并两个已排序的表.因为这两个表已排序,所以若将输出放到第三个表中,则该算法可以通过对输入数据一趟排序完成.基本的合并算法是取两个输入数组A和B,一个输出数组C,以及3个计数器Actr.Bctr.Cctr,他们初始置于对应数组的开始端.A[Actr]和B[Bctr]中的较小者被拷贝到C的下一个位置,相关的计数器向前推进一步.当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中. 合并另个已排序的表的时间显然是线性的,因为最多进行N-1次比较,其中

归并排序的go语言与C++实现对比

最近对go语言发生了兴趣,发现go语言语法简洁,非常适合算法的描述和实现,于是对归并排序进行了实现. 例子中需要排序的队列是长度为100的从100到1的数列,排序算法是正序排序,排序正确的话,结果应当为1到100. 因为已设定数组最大值为100,因此“哨兵”简略设置为1000,因为不是算法核心部分,此处“哨兵”最大值处理省略. 1 /* 2 归并排序的go语言实现 3 */ 4 package main 5 6 import fmt "fmt" 7 8 func main () { 9

[C语言] 归并排序的特性及实现

[C语言] 归并排序的特性及实现 1.算法特性 归并排序是一种高效且稳定的排序方法,其速度仅次于快速排序,但比较占用内存. 其时间复杂度最好.最差.平均情况均为O(nlog(2)n),空间复杂度为O(n). 2.算法思路 采用分治法的思路将问题分解.细化.逐个解决,即通过递归将无序序列不断分解,直到分解成序列有序(当序列长度为1时一定有序).再将分解的有序序列不断合并成新的有序序列,最后合并成一个有序序列. 3.实现代码 1 #include <stdio.h> 2 #include <

快速排序和归并排序(C语言)

1.0快速排序算法 (1)分解 (2)递归求解 (3)合并 int partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; int temp; while(1)  //将<x的元素交换到左边元素,>x的元素交换到右边元素 { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j) break; temp=a[i]; a[i]=a[j]; a[j]=