归并排序C语言
2014-02-19 22:02
288 查看
/*=============================================================================
# # FileName: merge_sort_in_c.c # Desc: 归并排序 # # Author: gavinyao # Email: gavinyao_tencent.com # # Created: 2013-12-25 23:55:02 # Version: 0.0.1 # History: # 0.0.1 | gavinyao | 2013-12-25 23:55:02 | initialization # =============================================================================*/ #include <stdio.h> #include <stdlib.h> // rand sranddev #define DEBUG 1 #define SORT_NUM 10 void print_array(int *list, int len); void merge_array(int *list1, int list1_size, int *list2, int list2_size); /** * @brief 归并排序 * * @param *list 要排序的数组 * @param n 数组中的元素数量 */ void merge_sort(int *list, int list_size) { if (list_size > 1) { // 把数组平均分成两个部分 int *list1 = list; int list1_size = list_size / 2; int *list2 = list + list_size / 2; int list2_size = list_size - list1_size; // 分别归并排序 merge_sort(list1, list1_size); merge_sort(list2, list2_size); // 归并 merge_array(list1, list1_size, list2, list2_size); } } /** * @brief 归并两个有序数组 * * @param list1 * @param list1_size * @param list2 * @param list2_size */ void merge_array(int *list1, int list1_size, int *list2, int list2_size) { int i, j, k; i = j = k = 0; // 声明临时数组用于存储归并结果 int list[list1_size + list2_size]; // note: 只要有一个数组到达了尾部就要跳出 // 也就是说只有两个都没有到达尾部的时候才执行这个循环 while (i < list1_size && j < list2_size) { // 把较小的那个数据放到结果数组里, 同时移动指针 list[k++] = list1[i] < list2[j] ? list1[i++] : list2[j++]; } // 如果 list1 还有元素,把剩下的数据直接放到结果数组 while (i < list1_size) { list[k++] = list1[i++]; } // 如果 list2 还有元素,把剩下的数据直接放到结果数组 while (j < list2_size) { list[k++] = list2[j++]; } // 把结果数组 copy 到 list1 里 for (int ii = 0; ii < (list1_size + list2_size); ++ii) { list1[ii] = list[ii]; } } /** * @brief 打印数组 * * @param list[] * @param len */ void print_array(int *list, int len) { int i; for (i = 0; i < len; ++i) { // printf("%3d", *(list+i)); printf("%3d", list[i]); if (i < len - 1) printf(" "); } printf("\n"); } int main(void) { int len = SORT_NUM; int list[len]; for (int i = 0; i < len; ++i) { sranddev(); list[i] = rand() % (SORT_NUM * SORT_NUM); } print_array(list, len); merge_sort(list, len); print_array(list, len); return 0; }
相关文章推荐
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- 基于C语言fflush()函数的使用详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- 探讨register关键字在c语言和c++中的差异
- C中实现矩阵乘法的一种高效的方法
- c语言printf函数的使用详解
- C语言学籍管理系统源代码
- 浅析C语言中的sizeof
- c语言内存泄露示例解析
- 浅析C语言位域和位段
- 解析C语言中位字段内存分配的问题
- 学生成绩管理系统C语言代码实现
- 基于C语言sprintf函数的深入理解
- C语言中函数声明与调用问题
- 基于malloc与free函数的实现代码及分析