LintCode刷题系列:数组排序--归并排序 递归
2017-07-19 16:19
260 查看
数组的归并排序:
void mergesort(int a[], int start, int end) {
int mid;
if(start < end) {
mid = (start + end)/2; //找到中间值
mergesort(a, start, mid);
mergesort(a, mid+1, end);
merge(a, start, mid, end); //合并
}
}
void merge(int a[], int start, int mid, int end) {
int n1 = mid - start + 1;
int n2 = end - mid;
int left[n1], right[n2];
int i, j, k;
for(i=0; i<n1; i++) {
left[i] = a[start+i];
}
for(j=0; j<n2; j++) {
right[j] = a[mid+1+j];
}
i=j=k=0;
while(i<n1 && j<n2) {
if(left[i] < right[j]) {
a[k] = left[i];
k++;
i++;
} else {
a[k] = right[j];
k++;
j++;
}
}
while(i<n1) {
a[k] = left[i];
k++;
i++;
}
while(j<n2) {
a[k] = right[j];
k++;
j++;
}
}
void mergesort(int a[], int start, int end) {
int mid;
if(start < end) {
mid = (start + end)/2; //找到中间值
mergesort(a, start, mid);
mergesort(a, mid+1, end);
merge(a, start, mid, end); //合并
}
}
void merge(int a[], int start, int mid, int end) {
int n1 = mid - start + 1;
int n2 = end - mid;
int left[n1], right[n2];
int i, j, k;
for(i=0; i<n1; i++) {
left[i] = a[start+i];
}
for(j=0; j<n2; j++) {
right[j] = a[mid+1+j];
}
i=j=k=0;
while(i<n1 && j<n2) {
if(left[i] < right[j]) {
a[k] = left[i];
k++;
i++;
} else {
a[k] = right[j];
k++;
j++;
}
}
while(i<n1) {
a[k] = left[i];
k++;
i++;
}
while(j<n2) {
a[k] = right[j];
k++;
j++;
}
}
相关文章推荐
- Lintcode-递归-177 把排序数组转换为高度最小的二叉搜索树
- lintcode刷题系列:链表排序----归并排序 递归
- python_lintcode_64合并排序数组 II_60搜索插入位置_142 O(1)时间检测2的幂次
- 归并排序(递归和非递归)和自然合并排序
- 算法熟记-排序系列-归并排序
- lintcode-将数组重新排序以构造最小值
- lintcode :search in rotated sorted array 搜索旋转排序数组
- hiho一下 第三十九周 #1141 : 二分·归并排序之逆序对 【归并排序----树状数组】
- 数组排序、递归——(Java学习笔记二)
- 排序系列之快速排序和归并排序
- LintCode【简单】100. 删除排序数组中的重复数字。代码及思路
- (lintcode)第6题 合并排序数组
- 每天学习算法系列—内部排序之归并排序和快速排序
- 【LintCode】删除排序数组中的重复数字
- lintcode-63-搜索旋转排序数组 II
- 【LintCode 简单】64. 合并排序数组
- lintcode 寻找旋转排序数组中的最小值
- LintCode: 删除排序数组中的重复数字
- LintCode:删除排序数组中的重复数字 II
- LintCode-搜索旋转排序数组 II