归并排序是排序里面常用的方法,它是由冯诺依曼发明的;
其空间复杂度为 O(n);
时间复杂度为O(n log n);
其采用一种分治的方法:解决一个给定的问题,算法一次或多次地调用自身以解决紧密相关的若干子问题;
我在这里的学习也是按照分治法的思想来进行的:
首先,对于一个数组我们可以拆分成一个个有序的数列:
比如
数列1:2 4 5 7;
数列2:1 2 3 6;
这里我们可以再创建一个空数列,从这两个数列中从前往后拿小的一个放进去,最后这两个数列为空的时候,新的数列就是有序数列;
这里我写出一部分演变步骤:
主:{}
①:2 4 5 7 ② :1 2 3 6
↓
主:{1,}
①:2 4 5 7 ② :2 3 6
↓
主:{1,2}
①:4 5 7 ② :2 3 6
↓
…………
↓
主:{1,2,2,3,4,5,6,7}
①: ② :
以上就是分布的过程;
我们用代码实现就是:
#include<stdio.h>
#include<stdlib.h>
int a[100] = {2,4,5,7,1,2,3,6};
void merge_1(int a[], int p, int q, int r) {
int n1, n2, i, j, k;
n1 = q - p +1;
n2 = r - q;
int left[100], right[100];
for (i = 0; i <= n1; i++) {
left[i] = a[p + i ];
}
for (j = 0; j < n2; j++) {
right[j] = a[q + j + 1 ];
}
i = 0;
j = 0;
for (k = p; k <= r; k++) {
if (left[i] <= right[j]&&i<n1&&j<=n2) {
a[k] = left[i];
i++;
}
else if(left[i] > right[j]&&i<=n1&&j<=n2) {
a[k] = right[j];
j++;
}
}
}
void merge_sort(int a[], int p, int r) {
int q;
if (p < r) {
q = (p + r) / 2;
merge_sort(a, p, q);
merge_sort(a, q + 1, r);
merge_1(a, p, q, r);
}
}
int main() {
int i;
merge_sort(a, 0, 7);
for(i=0;i<8;i++){
printf("%d",a[i]);
}
return 0;
}