全部学习汇总: GitHub - GreyZhang/c_basic: little bits of c.
近期在学习C语言数据结构,看到了排序。我看得是一本国外的书籍,直接网上寻找到的一个英文版。内容比较简洁,讲解也算是调理清晰。
关于排序算法,书中只讲了三种:冒泡排序、选择排序和归并排序。前两个的实现其实还是比较简单的,第三个涉及到递归的算法有时候理解起来会稍微麻烦一些。但是一旦理解了似乎又觉得是豁然开朗,一切清晰简单。
一直没有写过归并排序的算法,今天用C语言实现了一个简单的通用版本。测试代码中只测试了一个简单的case。
使用中,借用了部分之前的代码,实现起来比较简单,因此这里只展示核心的排序算法代码以及测试的Test Case。
核心排序算法代码如下:
void mergesort(void *array, size_t num_elements,size_t element_size, \
CMP_PROC_p_t cmp_proc)
{
int inx = 0;
int jnx = 0;
int knx = 0;
size_t lowHalf = 0;
size_t highHalf = 0;
BYTE_t *array1 = NULL;
BYTE_t *array2 = NULL;
void *tempArray;
if(num_elements > 1)
{
lowHalf = num_elements / 2;
highHalf = num_elements - lowHalf;
array1 = array;
array2 = array1 + lowHalf * element_size;
mergesort(array1,lowHalf,element_size,cmp_proc);
mergesort(array2,highHalf,element_size,cmp_proc);
}
else
{
lowHalf = 1;
highHalf = 0;
array1 = array;
}
tempArray = CDA_malloc(num_elements * element_size);
while((inx < (int)lowHalf) && (jnx < (int)highHalf))
{
if(cmp_proc(array1 + inx * element_size,array2 + jnx * element_size) < 0)
{
memcpy(tempArray + knx * element_size,array1 + inx * element_size,\
element_size);
inx += 1;
knx += 1;
}
else
{
memcpy(tempArray + knx * element_size,array2 + jnx * element_size,\
element_size);
jnx += 1;
knx += 1;
}
}
while(inx < (int)lowHalf)
{
memcpy(tempArray + knx * element_size,array1 + inx * element_size,\
element_size);
inx += 1;
knx += 1;
}
while(jnx < (int)highHalf)
{
memcpy(tempArray + knx * element_size,array2 + jnx * element_size,\
element_size);
jnx += 1;
knx += 1;
}
memcpy(array,tempArray,num_elements * element_size);
CDA_free(tempArray);
}
主函数部分的测试接口如下:
#include "stdio.h"
#include "mergesort.h"
int var1 = 5;
int var2 = 3;
int test_array[12] = {1,3,5,7,2,5,9,5,21,55,1,0};
int main(void)
{
int i = 0;
printf("value before sorted:\n");
for(i = 0; i < 12; i++)
{
printf("%d,",test_array[i]);
}
printf("\n");
mergesort(test_array,12,4,(CMP_PROC_p_t)CompareIntFunc);
printf("value after sorted:\n");
for(i = 0; i < 12; i++)
{
printf("%d,",test_array[i]);
}
printf("\n");
return 0;
}
编译与运行结果如下:
看起来排序算法应该问题不打了,但是有几个警告还需要处理一下。