归并主要是利用有序数列排序时,相对无序数列较快捷的特点进行排序,
1. Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
2. Conquer: 对这两个子序列分别采用归并排序。
3. Combine: 将两个排序好的子序列合并成一个最终的排序序列
递归到最底层是相邻两数间比较,返回,然后是相邻4个数间进行比较,每次规模加倍
那么为什么不直接就开始比较,第一次比较相邻两数,第二次比较相邻的四个数字,每次规模加倍;
代码如下
代码如下
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void _print(int*arr, int pos) { int i = 0; for (; i < pos; i++) { printf(" %d", arr[i]); } printf("\n"); } void sort_knel(int*arr,int*str,int left,int right,int pos,int sz) { int limt_left = left + pos; int limt_right = right + pos; int len = left; while (right < sz&&left < limt_left&&right < limt_right) { if (str[left]>str[right]) { arr[len] = str[right]; len++; right++; } else { arr[len] = str[left]; left++; len++; } } if (left == limt_left) { for (; len < limt_left&&len<sz; len++) { arr[len] = str[right]; right++; } } else { for (; len < limt_right&&len<sz; len++) { arr[len] = str[left]; left++; } } } void _sort(int*arr,int*str,int pos,int sz) { int i = 0; int j = 0; for (i = 0; i < sz+pos;i=i+pos*2) { sort_knel(arr,str,i,i+pos,pos,sz); } _print(arr, sz); } void sort(int*arr,int sz) { int i = 1; int *str = malloc(sizeof(int)*sz); //辅助数组 for (int j = 0; j < sz; j++) //初始化 { str[j] = arr[j]; } for (; i < sz; i = i * 2) { _sort(arr,str, i, sz); for (int j = 0; j < sz; j++) //初始化 { str[j] = arr[j]; } } free(str); } int main() { int arr[] = { 1, 5, 4, 4, 1, 36, 42, 3, 11, 5, 3,11,1,11 }; int sz = 0; sz=sizeof(arr) / sizeof(int); _print(arr, sz); sort(arr, sz); //_print(arr, sz); return 0; }