一、
主函数:void Mer_Sort(int* head,int low,int high,int Step_L,int Bool)
二路归并

参数解释
head:数组指针
[low, high]:需排序的数组范围
Step_L:需排序步长
Bool:等于1表示从小到大排序,不等于1从大到小排序

主函数引用:void Array_Merge(int* head,int low,int high,int* head1,int low1,int high1,int L,int Step_L,int Bool)
对两有序数组进行排序

参数解释
head:数组指针
[low high]:head数组中需要进行调整的范围
head1:数组指针
[low high]:head1数组中需要进行调整的范围
L:两数组中共需要调整的数据数量
Step_L:需排序步长
Bool:等于1表示从小到大排序,不等于1从大到小排序

说明
Step_L=1时,对下标low+{0,1,2,3,4,5…}排序
Step_L=2时,对下标low+{0,2,4,6,8,10…}排序
Step_L=3时,对下标low+{0,3,6,9,12,15…}排序
以此类推
例:

#include <stdio.h>
#include <time.h>//有序数组调整
void Array_Merge(int* head,int low,int high,int* head1,int low1,int high1,int L,int Step_L,int Bool){//i(逻辑),low+i*Step_L(实际)//第一个数组最后的位置为((high-low)/Step_L)(逻辑),high(实际),长度:(high-low)/Step_L+1//第二个数组最后的位置为((high1-low1)/Step_L)(逻辑),high1(实际),长度:(high1-low1)/Step_L+1 //复制int Temp[((high-low)/Step_L+1)+((high1-low1)/Step_L+1)];//临时数组int i=0,j=low,k=low1;//i指向Temp,指针j指向第1个数组,指针k指向第2个数组if(Bool){//有序数组为从小到大while(i<((high-low)/Step_L+1)+((high1-low1)/Step_L+1) && (j<=high || k<=high1)){if(k>high1){//当第二个数组指针k越界说明第二个数组已经安排完毕Temp[i]=head[j];j+=Step_L;i++;continue;}if(j>high){//当第一个数组指针j越界说明第一个数组已经安排完毕Temp[i]=head[k];k+=Step_L;i++;continue;}if(head[j]<=head1[k]){//选择两指针中更小的数据Temp[i]=head[j];j+=Step_L;}else{Temp[i]=head[k];k+=Step_L;}i++;}}else{//有序数组从大到小while(i<((high-low)/Step_L+1)+((high1-low1)/Step_L+1)  && (j<=high || k<=high1)){if(k>high1){//当第二个数组指针k越界说明第二个数组已经安排完毕Temp[i]=head[j];j+=Step_L;i++;continue;}if(j>high){//当第一个数组指针j越界说明第一个数组已经安排完毕Temp[i]=head[k];k+=Step_L;i++;continue;}if(head[j]>=head1[k]){//选择两指针中更小的数据Temp[i]=head[j];j+=Step_L;}else{Temp[i]=head[k];k+=Step_L;}i++;}}i=0;while(i<((high-low)/Step_L+1))//将第一个数组复制到head{head[low+i*Step_L]=Temp[i];i++;}while(i<((high-low)/Step_L+1)+((high1-low1)/Step_L+1))//将第二个数组复制到head{head1[low1+(i-((high-low)/Step_L+1))*Step_L]=Temp[i];i++;}
}//二路归并排序
void Mer_Sort(int* head,int low,int high,int Step_L,int Bool){int Shigh=low+(((high-low+1)/Step_L)-1+(((high-low+1)%Step_L)!=0))*Step_L;//需排序的最后一个元素int L=(Shigh-low)/Step_L+1;//需排序数组长度,第一个小分组[low low+Step_L … low+((L+1)/2-1)*Step_L]//需排序数组长度,第二个小分组[low+(((L+1)/2-1)+1)*Step_L … Shigh]if(L>2){//L为数组中需排序的长度,L>2时将数组进行分割两个小数组Mer_Sort(head,low,low+((L+1)/2-1)*Step_L,Step_L,Bool);Mer_Sort(head,low+(((L+1)/2-1)+1)*Step_L,Shigh,Step_L,Bool);}if(L>1)Array_Merge(head,low,low+((L+1)/2-1)*Step_L,head,low+(((L+1)/2-1)+1)*Step_L,Shigh,L,Step_L,Bool);
}int main(int argc, char **argv) {printf("Hello, World!\n");int s[5];s[0]=6;s[1]=5;s[2]=4;s[3]=3;s[4]=2;int i=0;while(i<5)printf("%d ",s[i++]);printf("\n---------\n");Mer_Sort(s,0,4,1,1);int j=0;while(j<5)printf("%d ",s[j++]);return 0;
}

7-二路归并排序C实现(递增递减的简单转换)相关推荐

  1. 1-冒泡排序C实现(递增递减的简单转换)

    一. 函数:void Bub_Sort(int* head,int low,int high,int Bool) 参数解释 head:数组指针 [low, high]:需排序的数组范围 Bool:等于 ...

  2. 6-堆排序C实现(递增递减的简单转换,可优化(41行提示))

    一. 主函数:void Hea_Sort(int* head,int low,int high,int Step_L,int Bool) 参数解释 head:数组指针 [low, high]:需排序的 ...

  3. 5-简单选择排序C实现(递增递减的简单转换)

    一. 函数:void Sec_Sort(int* head,int low,int high,int Step_L,int Bool) 参数解释 head:数组指针 [low, high]:需排序的数 ...

  4. 4-希尔排序C实现(递增递减的简单转换)

    一. 函数:void She_Sort(int* head,int low,int high,int* Step_S,int Step_Sl,int Bool) 参数解释 head:数组指针 [low ...

  5. 3-插入排序C实现(递增递减的简单转换)

    一. 参数解释 head:数组指针 [low, high]:需排序的数组范围 Bool:等于1表示从小到大排序,不等于1从大到小排序 说明 反向扫描数组中i到low范围 遇到更大的值则交换,遇到更小的 ...

  6. 2-快速排序C递归实现(递增递减的简单转换)

    一. 函数:void Quick_Sort(int *nums,int low,int high,int Bool) 参数解释 nums:数组指针 [low, high]:需排序的数组范围 Bool: ...

  7. 数据结构——二路归并排序和基数排序

    二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...

  8. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  9. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

最新文章

  1. 多线程下HashMap的死循环
  2. Hadoop报错AccessControlException: Permission denied: user=vincent, access=WRITE, inode=/:iie4bu:supe
  3. Hive _偏门常用查询函数(一)附带实例(空字段赋值、 CASE WHEN、行转列)
  4. Libra教程之:运行自定义move modules
  5. 微软自带的防反编译工具dotfuscator.exe的使用
  6. 【c语言】推断一个数是不是2的n次方
  7. codevs 1946 阿狸的打字机
  8. NLP特征工程(待完善细节)
  9. 制作软盘镜像文件的几种方法
  10. cad插入块_CAD块无法分解怎么办?
  11. HZK16汉字16*16点阵字库的使用及实例程序
  12. Knowledge-based Systems期刊投稿经历
  13. 不同大小硬盘对拷oracle,硬盘对拷方式克隆时必须注意一个大问题
  14. 2022G2电站锅炉司炉考试模拟100题及模拟考试
  15. 《论语》全译——八佾篇第三
  16. GB 21551.5家用和类似用途电器的抗菌、除菌、净化功能 洗衣机的特殊要求
  17. Keras安装+Pycharm配置Keras
  18. 时间序列分析之预处理(一)
  19. Elasticsearch: date时间数据格式踩过的坑
  20. 2022 ACM杰出会员揭榜:清华黄隆波、刘世霞,北大郝丹、刘譞哲等23位华人学者入选!...

热门文章

  1. css中实现div的显示和隐藏
  2. SwiftUI之深入解析高级动画的几何效果GeometryEffect
  3. Swift之深入解析“对象”的底层原理
  4. PIL Image resize 调整大小谜之操作
  5. 336. Palindrome Pairs 回文对
  6. 309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期
  7. gzip: stdin: unexpected end of file
  8. 《信息学奥赛一本通》回文数(Noip 1999)
  9. 【机器视觉】Qt联合Halcon编程之显示多图片
  10. 【Qt】QModbusServer类