编程练习:归并排序

来源:互联网 发布:银 现货软件 编辑:程序博客网 时间:2024/06/05 13:30
#include <stdio.h>#include <assert.h> /*assert()*/ #include <stdlib.h> /*malloc()*/ #include <string.h> /*memmove(), memset()*/ void Merge(int a[], int r[], int b, int m, int e) {int j, k;for( j = m+1,k = b; k <= e; ++k ) {if(b <= m && j <= e) if(a[b] <= a[j]) r[k] = a[b++];else r[k] = a[j++];    else break;}if( b <= m ) memmove(&r[k], &a[b], (m -b +1) * sizeof(int)); /*追加剩下的数组成员*/ if( j <= e ) memmove(&r[k], &a[j], (e -j +1) * sizeof(int)); /*追加剩下的数组成员*/ }void _MergeSort(int a[], int r[], int b, int e, int length) {int m = b + (e - b) / 2;int *pt = (int *)malloc(length * sizeof(int)); /*长度必须为length!*/ memset(pt, 0, (e-b+1) * sizeof(int)); /*分配的内存清零*/ if( b == e ) r[b] = a[b];else {_MergeSort(a, pt, b, m, length); /*归并排序数组的前面一半*/ _MergeSort(a, pt, m+1, e, length); /*归并排序数组的后面一半*/ Merge( pt,r,b,m,e ); /*前后两半合并*/ }free(pt);}void MergeSort( int a[], int b, int length) {int *r ;if (a == NULL || length <= 0 || b > length) return;r = (int *)malloc(length * sizeof(int));memset(r, 0, length * sizeof(int)); /*分配的内存清零*/ _MergeSort( a, r, b, length - 1, length);memmove(a, r, sizeof(int) * length); /*将数组r的数据复制到数组a中*/ free(r);}void test1() { /*测试用例1*/ int a[1] = { 2 }; MergeSort( a, 0, sizeof(a) / sizeof(a[0]) );assert(a[0] == 2);}void test2() { /*测试用例2*/ int a[10] = { 2,9,4,6,31,10,65,-1,0,4 }; MergeSort( a, 0, sizeof(a) / sizeof(a[0]) );assert(a[0] == -1);assert(a[1] == 0);assert(a[2] == 2);assert(a[3] == 4);assert(a[4] == 4);assert(a[5] == 6);assert(a[6] == 9);assert(a[7] == 10);assert(a[8] == 31);assert(a[9] == 65);}int main( int argc, const char *argv[] ) {test1();test2();return 0;}

原创粉丝点击