C版的迷你程序——归并排序算法

        把数据分段,从某段中逐个选最小的元素移入新数据段,然后再 段与段 之间比较再形成新的数据段。下面是通过打印学习这样的数据是如何搬移的:个人觉得这个思想并行处理上比较方便(分治办法)。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>

void ShowSortPro(int arr[], int len)
{
    int i;
    for (i=0; i<len; i++)
        printf("%6d ", arr[i]);
    printf(" \n");
}

static int selfmin(int x, int y) 
{
    return x < y ? x : y;
}
// 
// 归并排序
// 输入参数:数组
//           数组的长度
//
void MergeSort(int arr[], int len) {
    int* a = arr;
    int* b = (int*) malloc(len * sizeof(int));
    
    int seg, start;
    for (seg = 1; seg < len; seg += seg) {
        printf("============================================================================== seg%d\n", seg);
        for (start = 0; start < len; start += seg + seg) {
            printf("============================================================================ start%d\n", start);
            int low = start, mid = selfmin(start + seg, len), high = selfmin(start + seg + seg, len);
            int k = low;
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;
            
            while (start1 < end1 && start2 < end2){
                printf("start1=%d, start2=%d    end1=%d, end2=%d\n", start1, start2, end1, end2);
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
                ShowSortPro(b, len);
            }
            printf("---------------------------------------------------------------------------\n");
            while (start1 < end1)
                b[k++] = a[start1++];
            while (start2 < end2)
                b[k++] = a[start2++];
            ShowSortPro(b, len);
        }
        int* temp = a;
        a = b;
        b = temp;
        printf("============================================================================== seg%d\n", seg);
    }
    
    if (a != arr) {
        int i;
        for (i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    
    free(b);
}


void main() {
    int arr[] = { 65, 75, 59, 26, 92, 19, 8, 67, 86, 98, 87 };
    int len;

    // sizeof是运算符,不是函数
    // sizeof能求得静态分配内存的数组的长度,即占用内存的大小,以byte为单位
    len = (int) sizeof(arr) / sizeof(arr[0]);

    ShowSortPro(arr, len);
    printf("==================================================================================START\n");
    MergeSort(arr, len);
    printf("==================================================================================END\n");
    ShowSortPro(arr, len);
}

 


        测试编译器对代码进行自动优化编译和不优化的耗时比较。感兴趣的可以试试其他级别的优化,这里要注意优化后程序的结果要正确耗时比较才有意义。

 

 

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clyfk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值