并归排序的实现和简单分析
来源:互联网 发布:福建游龙网络 编辑:程序博客网 时间:2024/05/22 13:58
//将两排列有序的字符串进行有序合并#include <stdio.h>#include <stdlib.h>#include <string.h>char *hb(char *dest, char *s1, char *s2){int i, j , k;i = j = k = 0;while( s1[i] && s2[j] ){if(s1[i] < s2[j]){dest[k++] = s1[i++];}else{dest[k++] = s2[j++];}}dest[k] = '\0';if(s1[i] != '\0'){strcat(dest, s1+i);}if(s2[j] != '\0'){strcat(dest, s2+j);}return dest;}int main(void){char src1[] = "13579", src2[] = "2468", *dest;dest =(char *) malloc(strlen(src1) + strlen(src2) + 1);//dest = hb(dest,src1, src2);printf("%s\n", hb(dest, src1, src2));return 0;}/*akaedu@akaedu-G41MT-D3:~/lin/lb$ ./a.out 123456789*/<pre name="code" class="cpp">/***********************************///归并排序函数和二分查找(折半查找)#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#define N 10void init_num(int num[]){int i;srand(time(NULL));for(i = 0; i < N; i++){num[i] = rand()%50;}}void print_num(int num[]){int i;for(i = 0; i < N; i++){printf("%d ", num[i]);}printf("\n");}void merge(int num[], int start, int end){//N[5] = { 1 , 2 , 3, 5, 8 }; mid: (0 + 4)/2 = 2 1,2,3 5,8//N[6] = { 1 , 2 , 3, 5, 8, 15 }; mid: (0 + 5)/2 = 2 1,2,3 5,8,15//lenl为截断的左边长度 lenr为右端长度//pl为 lenl开辟的空间的指针 int i, j, k, lenl, lenr;int *pl, *pr;int mid = (start + end)/2;lenl = mid - start + 1; //lenl = mid + 1;lenr = end - mid;pl = (int *)malloc(lenl * sizeof(int));pr = (int *)malloc(lenr * sizeof(int));//检查pl pr 开辟空间是否成功if(!pl || !pr){printf("malloc fali\n");exit(1);}//将mid左边的数据copy到pl所指向的空间 右边的数据copy到pr所指向的空间memcpy(pl, num + start, lenl * sizeof(int));memcpy(pr, num + mid + 1, lenr * sizeof(int));i = j = 0, k = start;//i = j = k = 0;//merge 是把左右两段已经有序的数列进行有序合并,//k从start开始,比如mid的右边数组下标(3, 4)的值和左边数组下标(0,1,2)的值的进行比较合并的while(i < lenl && j < lenr){if(pl[i] < pr[j]){num[k++] = pl[i++];}else{num[k++] = pr[j++];}}//判断mid的左右两个数组中,其中的一个已经比较完毕,另//一个数组里面的数肯定是大于比较完毕的数组中的值,所以直接copy即可if(i < lenl){memcpy(num + k, pl + i, (lenl - i) * sizeof(int));}//num要加kif(j < lenr){memcpy(num + k, pr + j, (lenr - j) * sizeof(int));}//释放mallocfree(pl);free(pr);}//折半查找,前提必须是一个有序的数列//N[5] = { 1 , 2 , 3, 5, 8 }; mid: (0 + 4)/2 = 2 1,2,3 5,8//N[6] = { 1 , 2 , 3, 5, 8, 15 }; mid: (0 + 5)/2 = 2 1,2,3 5,8,15int binary_search(int num[],int key) {int mid, start = 0, end = N - 1; //mid, start, end 为数组的下标while(start <= end){mid = (start + end) / 2;if(num[mid] < key){start = mid + 1;}else if(num[mid] > key){end = mid - 1;}else//return num[mid];return mid;}return -1;}void merge_sort(int num[], int start, int end){//start = 0 end = N -1int mid;if(start >= end) //判断语句,返回值return;mid = (start + end)/2; merge_sort(num, start, mid);merge_sort(num, mid + 1, end);merge(num, start, end);}int main(void){int num[N];int key, x;init_num(num);print_num(num);merge_sort(num, 0, N - 1);printf("after sort...\n");print_num(num);scanf("%d", &key);x = binary_search(num, key);if(x == -1){printf("no find\n");}if(x != -1)printf("%d is %dth element in array\n", key, x + 1);return 0;}/*akaedu@akaedu-G41MT-D3:~/lin/20140827_exam$ ./616 32 47 0 38 4 32 13 16 48 after sort...0 4 13 16 16 32 32 38 47 48 1616 is 5th element in array*/
0 0
- 并归排序的实现和简单分析
- php实现并归排序
- 以链表和数组实现并归排序的区别
- 并归排序非递归实现
- Java语言 实现并归排序
- 并归排序算法java实现
- 并归排序算法
- 并归排序
- 并归排序
- 并归排序
- 并归排序
- 并归排序
- 并归排序
- 并归排序
- 并归排序
- 并归排序(JAVA)
- 并归排序算法
- 算法竞赛入门经典 快速排序和并归排序
- opencv2.1移植arm 出现找不到libcv.so not found (try using -rpath or -rpath-link) 及大量 undefined reference的解决
- ZOJ3541:The Last Puzzle(区间DP)
- 六、Sketchup用ruby进行二次开发--创建球体
- LINUX的目录树
- Java序列化Serializable和Externalizable
- 并归排序的实现和简单分析
- NOIP2014提高组模拟题 8.9
- Linux驱动学习——I2C
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V1(20140809)之HTML5端云整合:智能端应用与云端服务整合开发实战
- poj 3468 A Simple Problem with Integers(线段树的区间更新与求和)
- Android-Adapter
- C++多态的实现原理
- Eclipse设置dtd对struts.xml语法提示
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V1(20140809)之云计算大数据下MySQL企业级开发最佳实践