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) 算法应该同时支持多种数据类型。教科书上都是以整数排序为示例的,这种简化有利于学生将精力集中在算法
本身之上。但在现实中,我们不能只满足于了解算法本身,而是要写出一些具有实用价值的程序来。
对于前面提的两点要求——“算法应该同时支持升序排序和降序排序”和“算法应该同时支持多种数据类型”,如
果是认真阅读过前面章节的读者,应该马上会想到利用回调函数。
这样想就对了!软件设计的关键在于熟能生巧,我们反复练习这些基本技巧也意在于此。熟到凭本能就可以运用正
阅读(455) | 评论(0) | 转发(0) |