归并排序算法介绍

归并排序(Merging Sort)就是利用归并的思想实现排序的放。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,.....,如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

归并排序算法图解

归并排序算法代码

其实归并排序思路很好理解,就是将2个有序的序列合并,整个序列都是无序的哪里去找有序的序列?我们可以无限递归,将其划分为1个元素的序列,这时肯定是有序的咯,然后一路归并排序 就ok呀。主要是合并代码,仔细看 是不是应该这样去合并!

//归并排序的合并数组函数 升序
void Merge_Up(int *arr, int start, int mid, int  end, int *temp)
{int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;int length = 0;while (i_start <= i_end && j_start <= j_end){//升序 我小先放我if (arr[i_start] < arr[j_start]){temp[length] = arr[i_start];length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}//将剩余没有放完的放置到辅助空间中去while (i_start <= i_end){temp[length] = arr[i_start];length++;i_start++;}while (j_start <= j_end){temp[length] = arr[j_start];length++;j_start++;}//将辅助空间的值复制到源数组for (int i = 0; i < length; i++){arr[start + i] = temp[i];}return;
}/*
归并排序@param arr 归并排序的数组@param start 开始下标@param end 结束下标@param temp 辅助空间
*/
void MergeSort_Up(int *arr,int start,int end,int* temp)
{if (start >= end){return;}int mid = (start + end )/ 2;//分组//左半部分 进行归并排序MergeSort_Up(arr, start, mid, temp);//右半部分 进行归并排序MergeSort_Up(arr, mid + 1, end, temp);//合并排序好的2个数组Merge_Up(arr, start, mid, end, temp);}

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>
#define MAXSIZE 1000000
//交换值
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
//打印数组元素
void PrintArr(int* arr, int length)
{for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return;
}
long GetSysTime()
{struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}
//归并排序的合并数组函数 降序
void Merge_Down(int *arr, int start, int mid, int  end, int *temp)
{int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;int length = 0;//只有 1个元素时肯定是有序的,做为递归函数的出口。if (start >= end){return;}while (i_start <= i_end && j_start <= j_end){//降序 我大先放我if (arr[i_start] > arr[j_start]){temp[length] = arr[i_start];length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}//将辅助空间的值复制到源数组for (int i = 0; i < length; i++){arr[start + i] = temp[i];}}
//归并排序的合并数组函数 升序
void Merge_Up(int *arr, int start, int mid, int  end, int *temp)
{int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;int length = 0;while (i_start <= i_end && j_start <= j_end){//升序 我小先放我if (arr[i_start] < arr[j_start]){temp[length] = arr[i_start];length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}//将剩余没有放完的放置到辅助空间中去while (i_start <= i_end){temp[length] = arr[i_start];length++;i_start++;}while (j_start <= j_end){temp[length] = arr[j_start];length++;j_start++;}//将辅助空间的值复制到源数组for (int i = 0; i < length; i++){arr[start + i] = temp[i];}return;
}/*
归并排序@param arr 归并排序的数组@param start 开始下标@param end 结束下标@param temp 辅助空间
*/
void MergeSort_Up(int *arr,int start,int end,int* temp)
{if (start >= end){return;}int mid = (start + end )/ 2;//分组//左半部分 进行归并排序MergeSort_Up(arr, start, mid, temp);//右半部分 进行归并排序MergeSort_Up(arr, mid + 1, end, temp);//合并排序好的2个数组Merge_Up(arr, start, mid, end, temp);}int main(int argc, char *argv[])
{srand((size_t)time(NULL));//设置随机种子int arr[10] = { 6,8,2,3,9,7,4,1,5,10 };int *arr2 = (int*)malloc(sizeof(int)*MAXSIZE);//int *arr3 = (int*)malloc(sizeof(int)*MAXSIZE);//给每个元素设置一个随机值for (int i = 0; i < MAXSIZE; i++){int num = rand() % MAXSIZE;arr2[i] = num;//arr3[i] = num;}int *temp = (int*)malloc(sizeof(int)*10);int *temp1 = (int*)malloc(sizeof(int) * MAXSIZE);printf("排序前:\n");PrintArr(arr, 10);MergeSort_Up(arr, 0, 9, temp);printf("归并排序升序:\n");PrintArr(arr, 10);long start = GetSysTime();MergeSort_Up(arr2, 0, MAXSIZE - 1, temp1);long end = GetSysTime();printf("%d个元素 归并排序耗费%d毫秒\n",MAXSIZE,end-start);return 0;
}

代码运行检测

排序算法:归并排序算法实现及分析相关推荐

  1. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  2. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  3. 算法 归并排序的复杂度分析(含图解流程和Master公式)

    图解流程 整体流程如下: 细节流程: 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步: 第九步: 第十步: 代码 public static void mergeSort ...

  4. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 排序算法-归并排序的时间复杂度分析

    归并排序,其实就是递归+合并. 归并排序将数组取中间分为两部分,两个子数组分别各自再从中间分为两个子数组,一直分下去直到不能再分.分完之后,再按照子数组大小合并为为一个有序数组,然后层层向上合并,直到 ...

  7. 排序算法 —— 归并排序

    归并排序算法 1.划分问题:把序列分成元素个数尽量相等的两半. 2.递归求解:把两半元素分别排序. 3.合并问题:把两个有序表合并成一个. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用 ...

  8. 【算法】排序算法——归并排序

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言        归并排序是分治法在排序问题上的运用,因此为了更好地了解归并排序,首先了解 ...

  9. 数据算法排序之归并排序

    在你渐渐迷失在你的人生道路上的时候,千万不要因为走的太久,而忘记了我们为什么出发,做码农,也要清楚自己如何才能用有效的土地种植出 出色的产品,于是细节就需要把握一下. 如果你有兴趣可以关注一下公众号 ...

最新文章

  1. 打不开_网页打不开,怎解?
  2. 细说Asp.net的IP地址屏蔽功能设计
  3. 波司登的高端之路,难走!
  4. 薪酬与工作满意度大调查:数据科学家还是21世纪最性感的职业吗?
  5. C++ 内建函数对象
  6. DataTable类(MSDN)
  7. python黑网站_python
  8. 多线程socket编程示例
  9. kindle刷机ttl_求助大神!现在KPW2只能在TTL下进入uboot
  10. IntelliJ IDEA设置炫酷主题
  11. 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
  12. Codeforces Global Round 16 D2. Seating Arrangements (hard version)
  13. R 一行代码出Cox回归模型的表格
  14. java 中vo、po、dto、bo、pojo、entity、mode如何区分
  15. 倾斜摄影超大场景的三维模型在网络发布应用遇到常见的问题浅析
  16. echarts折线图设置圆点_echarts 设置折线图单个数据小圆圈样式
  17. 为什么说石油币是一场“国家骗局”?
  18. 自动驾驶技术之——被低估的传感器超声波雷达
  19. Lighthouse 激光定位技术开源了,但不是 Valve 做的
  20. 跨考 深大计算机,深圳大学!一所比985还要热门的双非!还很壕气!

热门文章

  1. 科技前沿及论文写作相关视频
  2. php str_replice_详解PHP字符串替换str_replace()函数四种用法
  3. null未定义_JS 里的数据类型 - null amp; undefined
  4. STM32H743+Keil-将变量定义到指定内存
  5. lnmp 清除mysql日志,军哥LNMP 如何关闭 Mysql 日志,并且删除 mysql-bin.0000*日志文件...
  6. h5 表单居中_3分钟学会易企秀H5操作(基础篇)
  7. Vue第二部分(1):组件基础学习
  8. C++笔记-二级指针在反汇编中的形式
  9. Qt实践| HTTP知识点-接入某图片验证码系统识别验证码
  10. 数据结构-图的基础代码