归并排序:

归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

归并操作的步骤例如以下:

    (1) 申请空间,使其大小为两个已经排序序列之和。该空间用来存放合并后的序列

    (2) 设定两个指针。最初位置分别为两个已经排序序列的起始位置

    (3) 比較两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

    (4) 反复步骤3直到某一指针到达序列尾

(5) 将还有一序列剩下的全部元素直接复制(抄)到合并序列尾

简单的说。就是将一个序列不断的进行二分(当然也能够三分、多分)分裂,然后递归下去。再合并。

源码:

/*=============================================================================
#
# FileName: Merge_Sort.c
# Desc: 归并排序
#
# Author: zhangyuqing
#
# Created: 2014年6月29日23:18:16
# Version: 0.0.1
#
=============================================================================*/ #include "stdafx.h"
#include <stdlib.h>
#include <malloc.h> //归并操作
void merge(int src[], int des[], int low, int high ,int mid)
{
int i = low;
int k = low;
int j = mid + 1; while (( i <= mid ) && ( j <= high ))
{
if (src[i] < src[j])
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while (i <= mid)
{
des[k++] = src[i++];
}
while (j <= high)
{
des[k++] = src[j++];
}
} void MSort(int src[], int des[] ,int low, int high, int max_size)
{
int mid = (low + high) / 2;
if (low == high)
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
int * des_space = (int *)malloc(sizeof(int) * max_size); if (NULL != des_space)
{
MSort( src, des_space, low, mid, max_size);
MSort( src, des_space, mid+1, high, max_size); merge( des_space, des, low, high, mid);
} free(des_space);
}
} void Meger_Sort(int arr[], int low, int high, int len)
{
MSort( arr, arr, low, high, len);
} int main(void)
{
int arr[10]; for ( int i=0; i<10; i++) //初始化数据
{
arr[i] = rand()%100; //随机生成数据
}
printf("Before sort:\n"); //打印排序前的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
} //開始排序
Meger_Sort( arr, 0, 10-1, 10); printf("\nAfter sort:\n"); //打印排序后的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}

执行结果:

Before sort:
41 67 34 0 69 24 78 58 62 64
After sort:
0 24 34 41 58 62 64 67 69 78 请按随意键继续. . .

如有错误,望不吝指出。

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

  1. 【最全】经典排序算法(C语言)

    算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...

  2. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

  3. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

  4. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  5. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  6. 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  7. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  8. C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

    C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...

  9. Java排序之归并排序

    Java排序之归并排序 1. 简介 归并排序的算法是将多个有序数据表合并成一个有序数据表.如果参与合并的只有两个有序表,则成为二路合并.对于一个原始的待排序数列,往往可以通过分割的方法来归结为多路合并 ...

随机推荐

  1. WinForm 小程序 NotePad

    运行效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  2. linux下的二进制文件的编辑和查看

    linux下的二进制文件的编辑和查看 http://blog.csdn.net/wangxiaoqin00007/article/details/6618003 一.在Linux下查看二进制文件的软件 ...

  3. 基于visual Studio2013解决算法导论之009快速排序随机版本

     题目 快速排序随机版本 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  4. 修改VISUAL STUDIO EXPRESS 2012新建C++文件编码

    本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使 ...

  5. POJ 1700 cross river (数学模拟)

                                                                                                       ...

  6. BitHacks--位操作技巧

    ---------------------------------------------------------------------------------------------------- ...

  7. Android屏幕大小适配问题解决

    转载: 一.一些基本概念 1.长度(真实长度):英寸.inch 2.分辨率:density 每英寸像素数  dpi(密度) 3.像素:px 4.dip的公式:px /dip=dpi/160  所以 d ...

  8. VMware machine里的文件

    .nvram——虚拟机BIOS或EFI配置文件. .vmdk——虚拟磁盘特性文件,是存放虚拟磁盘当前状况和上次执行快照时的状况之间的差异的快照文件. .vmsd——虚拟机快照,包含虚拟机快照信息的数据 ...

  9. WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)

    原文:WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话 ...

  10. 程序启动报错:ORA-12505;PL/SQL却可以登录的解决方法

    一.异常{ ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connect ...