话说这个东西写到凌晨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语言相关推荐

  1. 快速排序的递归和非递归实现 c语言版本

    代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...

  2. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  3. 迷宫的非递归求解 C语言 数据结构课程设计

    非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...

  4. c语言 二叉树先序遍历(非递归)

    /*************************** * author:vivi * date: 19-09-10 ****************************/ #include & ...

  5. c语言使用数组计算最大数。_程序设计入门——C语言_浙江大学_第10次开课

    课程概述 程序设计是一门基础课程.对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯:对于非计算机专业而言,程序设计的学习有助于理解计算机的能力所在,理解哪些是计算机 ...

  6. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  7. c语言用数组存储高精度数,高精度运算c语言.pptx

    <高精度运算c语言.pptx>由会员分享,可在线阅读,更多相关<高精度运算c语言.pptx(20页珍藏版)>请在人人文库网上搜索. 1.高精度运算,运算的前提条件:类型范围,确 ...

  8. 对c语言字符数组描述错误的是,下述对C语言字符数组的描述中错误的是( )。

    摘要: 条形图用频率值型来表分组分布示数数据,下述没有相邻之间间隔竖条.中国:在中大学列联分析,字符百分表的条件正确关于的是方向说法.条形图用频率值型来表分组分布示数数据,数组述中没有相邻之间间隔竖条 ...

  9. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

最新文章

  1. Node-RED简介与Windows上安装、启动和运行示例
  2. python preference界面设置_偏好设置如何更改Preference的样式
  3. java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常
  4. 剑指offer-3(替换空格)
  5. 浅谈Spring中JDK动态代理与CGLIB动态代理
  6. java ajaxsubmit_jQuery 使用 ajaxSubmit() 提交表单实现方法
  7. JS自定义鼠标右键菜单
  8. cavas的验证码效果demo
  9. python——【2】gzip模块二进制格式读取压缩文件
  10. React_music开发日记
  11. 我的世界JAVA会支持光追吗_光线追踪改变了「我的世界」,华硕ROG2060S显卡的光追体验...
  12. uefl计算机mbr分区方案,免重装系统 手把手教你MBR转GPT分区表-电脑教程
  13. 使用图灵机器人做简单的聊天系统
  14. bodipy荧光染料BDP R6G maleimide/马来酰亚胺,CAS:2183473-32-5
  15. 《Jira实战》作者王杰-使用Jira打造精益敏捷的交付能力
  16. 网规配置案例分析——国庆
  17. Java简单题-----计算一元二次方程的根
  18. 计算机科学期刊是ISTP吗,ISTP期刊是核心期刊吗
  19. 使用阿里云的oss对图片加水印并且字体大小自适应(阿里云oss暂不支持字体大小自适应)
  20. 微创新只是大公司用来挤压小公司的武器,但绝不是小公司与大公司竞争的法宝。——转自傅盛...

热门文章

  1. Unity实现爆炸的伤害值计算
  2. Charles监听HTTPS请求
  3. 丝蛋白行业调研报告 - 市场现状分析与发展前景预测
  4. 中国聚乙烯醇缩丁醛(PVB)树脂市场趋势报告、技术动态创新及市场预测
  5. Python实现输入电影名字自动生成豆瓣评论词云图(带GUI界面)小程序
  6. Python菜鸟入门:day19编程学习
  7. Jetty 和tomcat 比较研究初探
  8. 四周年了,谈谈一个程序员的职场心得
  9. AspectJ在Android 中的使用攻略
  10. 百度发布全新 NLG 训练模型 ERNIE-GEN,获 5 项 SOTA!