#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#define LEN 10
int bre_value ( int n, int cnt, int cnt_len[]);
void merge( int a[], int b[], int c[], int m, int n);
void merge_sort (int key[], int n);
void pri_fomt( int after_sort[]);

int main(){
        int length, i, j, cnt, sum = 0;
        int cnt_len[10] = { 0 };
        int *k, *m;
        printf("please input the length you input: ");
        scanf ("%d", &length);
        
        k = (int *)calloc(length, sizeof(int));
        printf("Please input the values to start the sorting:\n");
        for(i = 0; i < length; i++)
                k[i] = scanf("%d");

        cnt = bre_value(length, 0, cnt_len);
        for(i = 0; i < cnt; i++)
                for(j = 0; j < length; j += cnt_len[i])
                        merge_sort (k + j, cnt_len[i]);
        for(i = 0; i < cnt; i++){
                sum += cnt_len[i];
                m = (int *)calloc(sum + cnt_len[i+1], sizeof(int));
                merge(k, k + cnt_len[i], m, sum,cnt_len[i+1]);
                free(m);
        }
        
        for(i = 0; i < length; i++)
                printf("%d", k[i]);

        free(k);
        system("pause");
        return 0;

}

int bre_value ( int n, int cnt, int cnt_len[])
{
        int i;
        int compare = 1;
        if(n != 1){
        for(i = 0; compare < n; i++)
                compare *= 2;
            cnt_len[ cnt ] = compare;
                bre_value( n - compare, cnt + 1, cnt_len);
           }
        cnt_len[cnt+1] = 1;
        return cnt;
}
        
void merge( int a[], int b[], int c[], int m, int n)
{
        int i = 0, j = 0, k = 0;
        while ( i <= m && j <= n)
        {
                if(a[i] < b[j])
                        c[k++] = a[i++];
                else
                        c[k++] = b[j++];
        }
        while (i <= m)
                c[k++] = a[i++];
        while (j <= n)
                c[k++] = b[j++];
}
void merge_sort ( int key[], int n)
{
        int j, k, *w;
        w = (int *)calloc( n, sizeof(int));
        assert(w != NULL);
        for(k = 1; k <= n; k *= 2){
                for(j = 0; j < n - k; j += 2 * k)
                        merge(key + j, key + j + k, w + j, k, k);
                for(j = 0; j < n; j++)
                key[j] = w[j];
        }
        free(w);
}



Reply via email to