• 自然合并排序算法


    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void merge(int *a, int p, int q, int r)
    {
            int s1, e1;
            int s2, e2;
            int *temp = malloc((r-p+1) * sizeof(int));
            memset(temp, 0, sizeof(int));
            s1 = p; e1 = q;
            s2 = q+1; e2 = r;
            int index = s1;
            int i = 0;
            while(s1 <= e1 && s2 <= e2) {
                    if (a[s1] < a[s2]) {
                            temp[i++] = a[s1];
                            s1++;
                    }
                    else {
                            temp[i++] = a[s2];
                            s2++;
                    }
            }
            while (s1 < e1+1) {
                    temp[i++] = a[s1];
                    s1++;
            }
            while (s2 < e2+1) {
                    temp[i++] = a[s2];
                    s2++;
            }
            for (i = 0; i < r-p+1; i++) {
                    a[index + i] = temp[i];
            }
            free(temp);
    }
    
    void naturalMergeSort(int *a, int n)
    {
            int *index = malloc(n*sizeof(int));
            memset(index, 0, sizeof(int));
            int k = 1;
            int i;
            for (i = 0; i < n - 1; i++) {
                    if (a[i] > a[i+1]) {
                            index[k++] = i;
                    }
            }
            index[k] = n - 1;
            int s = 1;
            for (i = k; i > 1; i = (i % 2 == 0 ? (i / 2) : (i / 2 + 1))) {
                    int count = i / 2;
                    int p = 0;
                    int q = s;
                    int r = 2*s;
                    if (r > k ) {
                            r = k - 1;
                    }
                    merge(a, index[p], index[q], index[r]);
                    int j;
                    for (j = 1; j < count; j++) {
                            p = r;
                            q = p + s;
                            r = q + s;
                            if (r > k) {
                                    r = k -1;
                            }
                            merge(a, index[p] + 1, index[q], index[r]);
                    }
                    s += s;
            }
    }
    
    int main()
    {
            int a[8] = {4, 8, 3, 7, 1, 5, 6, 2};
            naturalMergeSort(a, 8);
            int i;
            for (i = 0; i < 8; i++) {
                    printf("%d ", a[i]);
            }
            printf("\n");
            return 0;
    }
  • 相关阅读:
    ASP连接mysql
    jsp中动态include与静态include的区别
    Create & Post free text invoice by code
    自定义Form作为Dialog
    动态多关联查询
    转到主表窗口
    获取当前用户组
    一个Job调用另外一个Job
    保存图片到硬盘
    在编辑框中增加右键菜单
  • 原文地址:https://www.cnblogs.com/taotao315/p/2959668.html
Copyright © 2020-2023  润新知