归并排序(C)
来源:互联网 发布:什么是算法设计 编辑:程序博客网 时间:2024/05/17 05:18
稳定 O(nlogn)
#include <stdio.h>
#include <stdlib.h>void ArrayCopy(int a[], int b[], int low, int high) {
while (low <= high) {
a[low] = b[low];
++low;
}
}
void Merge(int a[], int b[], int low, int mid, int high) {
int j = mid + 1;
int k = low; //b数组自增下标
int i = low;
while ((low <= mid) && (j <= high)) {
if (a[low] < a[j]) {
b[k++] = a[low++];
}
else {
b[k++] = a[j++];
}
}
if (j <= high) { //左半部分都进入b数组,把剩余的右半部分加入到b数组
while (j <= high) {
b[k++] = a[j++];
}
}
if (low <= mid) { //右半部分都进入b数组,把剩余的左半部分加入到b数组
while (low <= mid) {
b[k++] = a[low++];
}
}
ArrayCopy(a, b, i, high);
}
void MergeSort(int a[], int b[], int low, int high) {
int mid = 0;
if (low == high) {
b[low] = a[low];
return;
}
else {
mid = (low + high) / 2;
MergeSort(a, b, low, mid);
MergeSort(a, b, mid + 1, high);
Merge(a, b, low, mid, high);
}
}
int main() {
int i = 0;
int a[] = {1, 2, 3, 5, 4, 78, 56, 9, 87, 10};
int b[10] = {0};
printf("排序前: ");
for (i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%d ", a[i]);
printf("\n");
MergeSort(a, b, 0, sizeof(a)/sizeof(a[0])-1);
printf("排序后: ");
for (i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
- 归并排序(C)
- 归并排序(c++)
- 归并排序(C语言)
- 归并排序(C语言)
- 算法 - 归并排序(C#)
- 归并排序(C语言)
- MergeSort -- 归并排序(C++)
- 归并排序(c语言)
- 归并排序(C语言版)
- 归并排序(C语言版)
- 排序算法(C实现)-------- 归并排序
- 归并排序(C/C++)
- 归并排序算法实现(C++)
- 归并排序(C语言实现)
- 归并排序(C语言版本)
- 归并排序(递归版本)C实现~
- 归并排序 --- C语言版
- C++_归并排序
- CListBox的AddString 排序问题
- 遍历目录所有文件
- Fisher线性判别
- jmeter之“聚合报告”
- 菜鸟之驱动开发5
- 归并排序(C)
- servlet3.0 新特性
- 持续集成之“自动化部署”
- 练习--链式二叉树
- ubuntu apt命令详解
- 今天继续纠结在ctrl+z上面了
- fcgi作为客户端需要注意的几点
- vc6.0使用DriverWizard.awx配置DDK驱动编译环境
- LVS简介