并归排序的实现和简单分析

来源:互联网 发布:福建游龙网络 编辑:程序博客网 时间: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