• 归并排序实例


    通用函数:

    /* common.h */
    
    #ifndef _COMMON_H
    #define _COMMON_H
    
    void swap(int *ap, int *bp);
    void print_array(const int array[], int n);
    
    #endif
    /* common.c */
    
    #include "common.h"
    #include <stdio.h>
    
    void 
    swap(int *ap, int *bp)
    {
        int tmp;
        
        tmp = *ap;
        *ap = *bp;
        *bp = tmp;
    }
    
    void 
    print_array(const int array[], int n)
    {
        int i;
    
        for(i = 0; i < n; i++)
            printf("%d ", array[i]);
        printf("
    ");
    }

    归并排序函数:

    /* merge_sort.h */
    
    #ifndef _MERGE_SORT_H
    #define _MERGE_SORT_H
    
    void merge(int array[], int tmparray[], int lpos, int rpos, int rightend);
    void msort(int array[], int tmparray[], int left, int right);
    void merge_sort(int array[], int n);
    
    #endif
    /* merge_sort.c */
    
    #include "merge_sort.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    /* lpos = start of left half, rpos = start of right half */
    void 
    merge(int array[], int tmparray[], int lpos, int rpos, int rightend)
    {
        int i, leftend, num_elements, tmpos;
    
        leftend = rpos - 1;
        tmpos = lpos;
        num_elements = rightend - lpos + 1;
        
        /* main loop */
        while(lpos <= leftend && rpos <= rightend)
        {
            if(array[lpos] <= array[rpos])
                tmparray[tmpos++] = array[lpos++];
            else
                tmparray[tmpos++] = array[rpos++];
        }
        
        while(lpos <= leftend)    /* copy rest of first half */
            tmparray[tmpos++] = array[lpos++];
        while(rpos <= rightend)    /* copy rest of second half */
            tmparray[tmpos++] = array[rpos++];
        
        /* copy tmparray back */
        for(i = 0; i < num_elements; i++, rightend--)
            array[rightend] = tmparray[rightend];
    }
    
    void 
    msort(int array[], int tmparray[], int left, int right)
    {
        int center;
        
        if(left < right)
        {
            center = (left + right) / 2;
            msort(array, tmparray, left, center);
            msort(array, tmparray, center + 1, right);
            merge(array, tmparray, left, center + 1, right); 
        }
    }
    void 
    merge_sort(int array[], int n)
    {
        int * tmparray;
        
        tmparray = malloc(n * sizeof(int));
        if(tmparray != NULL)
        {
            msort(array, tmparray, 0, n - 1);
            free(tmparray);
        }
        else
        {
            printf("No space for tmp array!!!
    ");
            exit(1);
        }
    }

    测试函数:

    /* merge_sort_test.c */
    
    #include "max_heap_sort.h"
    #include <stdio.h>
    
    int 
    main(void)
    {
        int array[] = {31, 24, 45, 67, 54, 87, 98, 12, 15, 89};
        heap_sort(array, 10);
        print_array(array);
    }

    Makefile:

    /* Makefile */
    
    target := test
    objs := merge_sort_test.o merge_sort.o common.o
    $(target):$(objs)
        gcc -o $@ $^
    %.o:%.c
        gcc -c -o $@ $<
    
    clean:
        rm *.o test

    测试结果:

    image

  • 相关阅读:
    log4j学习总结
    MAVEN工程生成可执行的jar包
    从svn上下载maven项目import cannot resolved
    junit4使用说明
    uml中箭头的意思
    maven命令
    mavenSvn
    ASP.NET MVC学习笔记:(二)return View(...)
    WPF学习笔记:(一)数据绑定与DataContext
    WCF学习笔记(五):svc、config和code文件之间的关系
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3665397.html
Copyright © 2020-2023  润新知