归并排序
2020-06-25 本文已影响0人
foolish_hungry
思想:先分后合思想, 分到不可以在分, 然后比较大小, 合并数据。
看图清晰明了
代码实现
// 归并排序算法, a 数组, n 表示数组大小
void mergeSort(int a[], int n) {
if (n <= 1) {
return;
}
mergeSort_c(a, 0, n - 1);
// 打印数据
for (int i = 0; i < n; i++) {
NSLog(@"%d", a[i]);
}
}
// 递归调用函数
void mergeSort_c(int a[], int left, int right) {
// 递归终止条件
if (left >= right) {
return;
}
// 找到中间位置
int mid = (left + right) / 2;
// 分治递归
mergeSort_c(a, left, mid);
mergeSort_c(a, mid + 1, right);
// 合并数据
mergeData(a, left, mid, right);
}
// 将数据合并
void mergeData(int a[], int left, int mid, int right) {
int i, j, k;
i = left;
j = mid + 1;
k = 0;
// 创建临时数组, 用于数据合并
int temNum = (right - left) + 1;
int tempArr[temNum];
// 将前半部分和后半部分数据比较, 合并到临时数组
while (i <= mid && j <= right) {
if (a[i] < a[j]) {
tempArr[k++] = a[i++];
} else {
tempArr[k++] = a[j++];
}
}
// 将前半部分没有迁移的数据直接赋值到临时数组后面
while (i <= mid) {
tempArr[k++] = a[i++];
}
// 将后半部分没有迁移的数据直接赋值到临时数组后面
while (j <= right) {
tempArr[k++] = a[j++];
}
// 将临时数组中的数据赋值到原始数组中
for (int l = left; l <= right; l++) {
a[l] = tempArr[l-left];
}
}
使用
int a[] = {4, 13, 2, 1, 7, 9, 10, 8, 3, 6};
int num = sizeof(a) / sizeof(int);
mergeSort(a, num);