#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);
}