0
点赞
收藏
分享

微信扫一扫

1781_通用型归并排序函数的C语言实现


全部学习汇总: 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;
}

编译与运行结果如下:

1781_通用型归并排序函数的C语言实现_开发语言

看起来排序算法应该问题不打了,但是有几个警告还需要处理一下。

举报

相关推荐

0 条评论