c语言归并排序数组不固定,归并排序非递归实现C语言
话说这个东西写到凌晨3点27分,都没有写好.刚才睡醒了写完的.主要遇到的问题就是当数组大小不是2的幂的时候发生的 right_end 越界的时候.我的逻辑起初偏于复杂,后来重新组织逻辑,当发生 right_end 越界的时候, 取 size - 1 为 right_end, 并且保持前一个数组完整, 后一个数组的大小不去顾及. 这样问题就解决了.
这貌似加深了我对归并排序的理解.
/*7-14-11-21-00.21.c -- 第七章第十四题*/
#include
#include
#include
int main (void) ;
void initialize_array (int * const array, const int size, const int max_value) ;
void print_array (const int * const array, const int size) ;
int test (const int * const array, const int size) ;
void merge_sort (int * const array, const int size) ;
void merge (int * const array, int * const temp, int left_position, int right_position, int right_end) ;
int get_power (const int size) ;
int pow_base_two (const int power) ;
int main (void)
{
int * array ;
int size, max_value ;
size = 15, max_value = 120 ;
array = (int *) malloc (sizeof (int) * size) ;
if (NULL == array)
{
printf ("Out of space occurred in /"main/"/n") ;
return 0 ;
}
initialize_array (array, size, max_value) ;
print_array (array, size) ;
merge_sort (array, size) ;
print_array (array, size) ;
printf ("%s/n", 1 == test (array, size) ? "OK" : "Wrong") ;
free (array) ;
return 0 ;
}
void initialize_array (int * const array, const int size, const int max_value)
{
int i ;
srand ((unsigned int) time (NULL)) ;
for (i = 0; i < size; i++)
array[i] = rand () % max_value + 1 ;
}
void print_array (const int * const array, const int size)
{
int i ;
for (i = 0; i < size; i++)
printf ("%d/n", array[i]) ;
putchar ('/n') ;
}
int test (const int * const array, const int size)
{
int i ;
for (i = 1; i < size; i++)
{
if (array[i] < array[i - 1])
return 0 ;
}
return 1 ;
}
void merge_sort (int * const array, const int size)
{
int * temp ;
int left_position, right_end, center, i, j, value, power ;
temp = (int *) malloc (sizeof (int) * size) ;
if (NULL == temp)
{
printf ("Out of space occurred in /"merge_sort/"/n") ;
return ;
}
power = get_power (size) ;
for (i = 1, value = pow_base_two (i); i <= power; i++, value = pow_base_two (i))
{
for (j = 0; j < size; j += value)
{
left_position = j ;
right_end = j + value - 1 ;
if (right_end > size - 1)
{
right_end = size - 1 ;
center = left_position + value / 2 - 1 ;
}
else
center = (left_position + right_end) / 2 ;
merge (array, temp, left_position, center + 1, right_end) ;
}
}
free (temp) ;
}
void merge (int * const array, int * const temp, int left_position, int right_position, int right_end)
{
int left_end, temp_position, count, i ;
left_end = right_position - 1 ;
temp_position = left_position ;
count = right_end - left_position + 1 ;
while (left_position <= left_end && right_position <= right_end)
{
if (array[left_position] < array[right_position])
temp[temp_position++] = array[left_position++] ;
else
temp[temp_position++] = array[right_position++] ;
}
while (left_position <= left_end)
temp[temp_position++] = array[left_position++] ;
while (right_position <= right_end)
temp[temp_position++] = array[right_position++] ;
for (i = 0; i < count; i++, right_end--)
array[right_end] = temp[right_end] ;
}
int get_power (const int size)
{
int power, value ;
for (power = 1, value = 1; value <= size; power++)
{
value *= 2 ;
if (value >= size)
break ;
}
return power ;
}
int pow_base_two (const int power)
{
int i, value ;
if (power <= 0)
{
puts ("Can't work.") ;
return 0 ;
}
for (i = 1, value = 1; i <= power; i++)
value *= 2 ;
return value ;
}
后记:无意中发现了下面这段代码.我深深地感觉到我的想法有多么愚蠢! 人家的确实好,我的的代码好费力啊!
void
Mergesort( ElementType A[ ], int N )
{
ElementType *TmpArray;
int SubListSize, Part1Start, Part2Start, Part2End;
TmpArray = malloc( sizeof( ElementType ) * N );
for( SubListSize = 1; SubListSize < N; SubListSize *= 2 )
{
Part1Start = 0;
while( Part1Start + SubListSize < N - 1 )
{
Part2Start = Part1Start + SubListSize;
Part2End = min( N, Part2Start + SubListSize - 1 );
Merge( A, TmpArray, Part1Start, Part2Start, Part2End );
Part1Start = Part2End + 1;
}
}
}
c语言归并排序数组不固定,归并排序非递归实现C语言相关推荐
- 快速排序的递归和非递归实现 c语言版本
代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...
- c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...
- 迷宫的非递归求解 C语言 数据结构课程设计
非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...
- c语言 二叉树先序遍历(非递归)
/*************************** * author:vivi * date: 19-09-10 ****************************/ #include & ...
- c语言使用数组计算最大数。_程序设计入门——C语言_浙江大学_第10次开课
课程概述 程序设计是一门基础课程.对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯:对于非计算机专业而言,程序设计的学习有助于理解计算机的能力所在,理解哪些是计算机 ...
- c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用
指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...
- c语言用数组存储高精度数,高精度运算c语言.pptx
<高精度运算c语言.pptx>由会员分享,可在线阅读,更多相关<高精度运算c语言.pptx(20页珍藏版)>请在人人文库网上搜索. 1.高精度运算,运算的前提条件:类型范围,确 ...
- 对c语言字符数组描述错误的是,下述对C语言字符数组的描述中错误的是( )。
摘要: 条形图用频率值型来表分组分布示数数据,下述没有相邻之间间隔竖条.中国:在中大学列联分析,字符百分表的条件正确关于的是方向说法.条形图用频率值型来表分组分布示数数据,数组述中没有相邻之间间隔竖条 ...
- 【Java】 归并排序的非递归实现
归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...
最新文章
- Node-RED简介与Windows上安装、启动和运行示例
- python preference界面设置_偏好设置如何更改Preference的样式
- java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常
- 剑指offer-3(替换空格)
- 浅谈Spring中JDK动态代理与CGLIB动态代理
- java ajaxsubmit_jQuery 使用 ajaxSubmit() 提交表单实现方法
- JS自定义鼠标右键菜单
- cavas的验证码效果demo
- python——【2】gzip模块二进制格式读取压缩文件
- React_music开发日记
- 我的世界JAVA会支持光追吗_光线追踪改变了「我的世界」,华硕ROG2060S显卡的光追体验...
- uefl计算机mbr分区方案,免重装系统 手把手教你MBR转GPT分区表-电脑教程
- 使用图灵机器人做简单的聊天系统
- bodipy荧光染料BDP R6G maleimide/马来酰亚胺,CAS:2183473-32-5
- 《Jira实战》作者王杰-使用Jira打造精益敏捷的交付能力
- 网规配置案例分析——国庆
- Java简单题-----计算一元二次方程的根
- 计算机科学期刊是ISTP吗,ISTP期刊是核心期刊吗
- 使用阿里云的oss对图片加水印并且字体大小自适应(阿里云oss暂不支持字体大小自适应)
- 微创新只是大公司用来挤压小公司的武器,但绝不是小公司与大公司竞争的法宝。——转自傅盛...