7-二路归并排序C实现(递增递减的简单转换)
一、
主函数: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-冒泡排序C实现(递增递减的简单转换)
一. 函数:void Bub_Sort(int* head,int low,int high,int Bool) 参数解释 head:数组指针 [low, high]:需排序的数组范围 Bool:等于 ...
- 6-堆排序C实现(递增递减的简单转换,可优化(41行提示))
一. 主函数:void Hea_Sort(int* head,int low,int high,int Step_L,int Bool) 参数解释 head:数组指针 [low, high]:需排序的 ...
- 5-简单选择排序C实现(递增递减的简单转换)
一. 函数:void Sec_Sort(int* head,int low,int high,int Step_L,int Bool) 参数解释 head:数组指针 [low, high]:需排序的数 ...
- 4-希尔排序C实现(递增递减的简单转换)
一. 函数:void She_Sort(int* head,int low,int high,int* Step_S,int Step_Sl,int Bool) 参数解释 head:数组指针 [low ...
- 3-插入排序C实现(递增递减的简单转换)
一. 参数解释 head:数组指针 [low, high]:需排序的数组范围 Bool:等于1表示从小到大排序,不等于1从大到小排序 说明 反向扫描数组中i到low范围 遇到更大的值则交换,遇到更小的 ...
- 2-快速排序C递归实现(递增递减的简单转换)
一. 函数:void Quick_Sort(int *nums,int low,int high,int Bool) 参数解释 nums:数组指针 [low, high]:需排序的数组范围 Bool: ...
- 数据结构——二路归并排序和基数排序
二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...
- 数据结构源码笔记(C语言):二路归并排序
//实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...
- C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...
最新文章
- 多线程下HashMap的死循环
- Hadoop报错AccessControlException: Permission denied: user=vincent, access=WRITE, inode=/:iie4bu:supe
- Hive _偏门常用查询函数(一)附带实例(空字段赋值、 CASE WHEN、行转列)
- Libra教程之:运行自定义move modules
- 微软自带的防反编译工具dotfuscator.exe的使用
- 【c语言】推断一个数是不是2的n次方
- codevs 1946 阿狸的打字机
- NLP特征工程(待完善细节)
- 制作软盘镜像文件的几种方法
- cad插入块_CAD块无法分解怎么办?
- HZK16汉字16*16点阵字库的使用及实例程序
- Knowledge-based Systems期刊投稿经历
- 不同大小硬盘对拷oracle,硬盘对拷方式克隆时必须注意一个大问题
- 2022G2电站锅炉司炉考试模拟100题及模拟考试
- 《论语》全译——八佾篇第三
- GB 21551.5家用和类似用途电器的抗菌、除菌、净化功能 洗衣机的特殊要求
- Keras安装+Pycharm配置Keras
- 时间序列分析之预处理(一)
- Elasticsearch: date时间数据格式踩过的坑
- 2022 ACM杰出会员揭榜:清华黄隆波、刘世霞,北大郝丹、刘譞哲等23位华人学者入选!...
热门文章
- css中实现div的显示和隐藏
- SwiftUI之深入解析高级动画的几何效果GeometryEffect
- Swift之深入解析“对象”的底层原理
- PIL Image resize 调整大小谜之操作
- 336. Palindrome Pairs 回文对
- 309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期
- gzip: stdin: unexpected end of file
- 《信息学奥赛一本通》回文数(Noip 1999)
- 【机器视觉】Qt联合Halcon编程之显示多图片
- 【Qt】QModbusServer类