Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29913
  • 博文数量: 11
  • 博客积分: 346
  • 博客等级: 一等列兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-14 16:20
文章分类
文章存档

2012年(11)

我的朋友
最近访客

分类: C/C++

2012-05-21 15:36:21


static Ret darray_shrink(DArray* thiz)
  {
  return_val_if_fail(thiz != NULL, RET_INVALID_PARAMS);
  if((thiz->size < (thiz->alloc_size >> 1)) &&
  (thiz->alloc_size > MIN_PRE_ALLOCATE_NR))
  {
  size_t alloc_size = thiz->size + (thiz->size >> 1);
  void** data = (void**)realloc(thiz->data, sizeof(void*) * alloc_size);
  if(data != NULL)
  {
  thiz->data = data;
  thiz->alloc_size = alloc_size;
  }
  }
  return RET_OK;
  }
  Ret darray_delete(DArray* thiz, size_t index)
  {
  size_t i = 0;
  Ret ret = RET_OK;
  return_val_if_fail(thiz != NULL && thiz->size > index, RET_INVALID_PARAMS);
  darray_destroy_data(thiz, thiz->data[index]);
  for(i = index; (i+1) < thiz->size; i++)
  {
  thiz->data[i] = thiz->data[i+1];
  }
  thiz->size--;
  darray_shrink(thiz);
  return RET_OK;
  }
  为了避免极端情况下频繁resize,在总空间小于或等于MIN_PRE_ALLOCATE_NR时,我们并不减少空间的大小。
  3.2 排序
  大多数高级排序算法都是针对数组实现的,接下来我们一起来学习以下几种排序算法,学习算法本身只是我们的目
标之一,最重要的是要从中学习一些思考问题的方法。对比不同算法的特点,也有助于我们在设计时做出正确的选择。
  这里我们请读者实现冒泡排序、快速排序和归并排序。要求如下。
  (1) 算法应该同时支持升序排序和降序排序。在升序排列中,前面的元素总是小于或等于后面的元素;在降序排序
中,前面的元素总是大于或等于后面的元素。
  (2) 算法应该同时支持多种数据类型。教科书上都是以整数排序为示例的,这种简化有利于学生将精力集中在算法
本身之上。但在现实中,我们不能只满足于了解算法本身,而是要写出一些具有实用价值的程序来。
  对于前面提的两点要求——“算法应该同时支持升序排序和降序排序”和“算法应该同时支持多种数据类型”,如
果是认真阅读过前面章节的读者,应该马上会想到利用回调函数。
  这样想就对了!软件设计的关键在于熟能生巧,我们反复练习这些基本技巧也意在于此。熟到凭本能就可以运用正
确的方法时,那也离所谓的高手不远了。言归正传,我们已经定义过比较回调函数的原型了。更多相关文章http://blog.jrj.com.cn/1938113521

 
阅读(455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~