归并排序(Merging Sort)
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
|
#include<iostream>
using namespace std;
//归并排序,先数组细分为单个,在合并
int mergeArr(int* arr,int first,int mid,int last);
int mergeSort(int* arr,int first,int last); //递归实现
int mergeSortIterator(int* arr,int first,int last); //非递归实现
void swap(int& elem1,int& elem2);
void test();
void printArr(int* arr,int length);
int mergeArr(int* arr,int first,int mid,int last)
{
if(NULL==arr||first>last||first>mid||mid>last||first<0||mid<0||last<0)
return -1;
int len = last - first +1;
int* tmpArr = new int[len]();
int firIdx = first,lasIdx = mid + 1;
int idx = 0;
while(firIdx<=mid&&lasIdx<=last)
{
if(arr[firIdx]<arr[lasIdx])
tmpArr[idx++] = arr[firIdx++];
else
tmpArr[idx++] = arr[lasIdx++];
}
while(firIdx<=mid)
tmpArr[idx++] = arr[firIdx++];
while(lasIdx<=last)
tmpArr[idx++] = arr[lasIdx++];
for(int iidx=first,idx=0;iidx<=last;++iidx)
arr[iidx] = tmpArr[idx++];
delete []tmpArr;
return 0;
}
int mergeSort(int* arr,int first,int last)
{
if(NULL==arr||first<0||last<0||first>last)
return -1;
int mid = (first + last)/2;
if(first<last) //划分为只有一个元素
{
mergeSort(arr,first,mid);
mergeSort(arr,mid+1,last);
}
//合并
mergeArr(arr,first,mid,last);
return 0;
}
int mergeSortIterator(int* arr,int first,int last)
{
if(NULL==arr||first<0||last<0||first>last)
return -1;
//非递归,直接合并
for(int idx=1;idx<=last;idx*=2) //都是两两合并,所以乘以2,最初从1开始,表示数组都划分为1的单个数组
{
int firstIdx = 0;
while(firstIdx+idx<=last)
{
int mid = firstIdx + idx -1;
//last有特殊情况,比如数组奇数个,最后会剩下一个元素
int lastIdx = mid + idx <= last ? mid + idx : last;
mergeArr(arr,firstIdx,mid,lastIdx);
firstIdx = lastIdx + 1; //开始合并下一个子序列
}
}
return 0;
}
|
void printArr(int* arr,int length)
{
if(NULL==arr||length<=0)
return ;
for(int idx=0;idx!=length;++idx)
{
cout<<arr[idx]<<" ";
}
cout<<endl;
}
void test()
{
int arr[] = {6,5,3,1,8,7,2,4};
printArr(arr,8);
mergeSort(arr,0,7);
/*mergeSortIterator(arr,0,7);*/
printArr(arr,8);
cout<<endl;
int arr1[] = {1,2,0,-1,5,6,8,3};
printArr(arr1,8);
mergeSort(arr1,0,7);
/*mergeSortIterator(arr1,0,7);*/
printArr(arr1,8);
cout<<endl;
int arr2[] = {2,2,2,2};
printArr(arr2,4);
mergeSort(arr2,0,3);
//mergeSortIterator(arr2,0,3);
printArr(arr2,4);
cout<<endl;
int arr3[] = {2,4,1};
printArr(arr3,3);
mergeSort(arr3,0,2);
/*mergeSortIterator(arr3,0,2);*/
printArr(arr3,3);
cout<<endl;
int arr5[] = {1,2,3,4,5,6,7,8};
printArr(arr5,8);
mergeSort(arr5,0,7);
/*mergeSortIterator(arr5,0,7);*/
printArr(arr5,8);
cout<<endl;
int* arr6 = NULL;
printArr(arr6,4);
mergeSort(arr6,0,3);
/*mergeSortIterator(arr6,0,3);*/
printArr(arr6,4);
cout<<endl;
}
int main()
{
test();
system("pause");
}
|
|
//归并排序,一般的空间复杂度都是O(n),现在要O(1)
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
return ;
}
void reverse(int* arr,int len) //len个元素的数组逆序
{
if(NULL==arr)
return ;
int first = 0,end = len-1;
while(first<end)
{
swap(arr[first++],arr[end--]);
}
return ;
}
void printArr(int* arr,int len)
{
if(NULL==arr)
return ;
for(int idx=0;idx!=len;++idx)
{
cout<<arr[idx]<<" ";
}
cout<<endl;
return;
}
|
void moveLeft(int* arr,int len,int cnt) //arr数组,长度len,左移cnt个元素
{
if(NULL==arr||len<=0)
return ;
reverse(arr,cnt); // 1 2 3 4 5 ,左移3个位置,arr,5,3
reverse(arr+cnt,len-cnt);
reverse(arr,len);
}
void mergeArr(int* arr,int first,int mid,int end)
{
if(NULL==arr||first>end||mid>end)
return ;
int second = mid + 1;
while(first<=mid&&second<=end)
{
int secondLow = 0;
while( first<=mid && arr[first]<=arr[second] )
++first;
while( second<=end && arr[second]<=arr[first] )
{
++second;
++secondLow;
}
moveLeft(arr+first,second-first,second - first - secondLow);
first += secondLow;
}
return ;
}
void mergeSort(int* arr,int first,int end)
{
if(NULL==arr)
return;
if(first<end)
{
int mid = (first + end)/2;
mergeSort(arr,first,mid);
mergeSort(arr,mid+1,end);
//归并
mergeArr(arr,first,mid,end);
}
}
int main(int argc,char** argv)
{
int arr[] = {6,4,3,1,7,8,2,9,5,0};
mergeSort(arr,0,9);
printArr(arr,10);
system("pause");
}
|
归并排序(Merging Sort)的更多相关文章
- 数据结构 - 归并排序(merging sort)
归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...
- 数据结构 - 归并排序(merging sort) 具体解释 及 代码
归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...
- 小小c#算法题 - 8 - 归并排序 (Merging Sort)
“归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然 ...
- FZU 1919 -- K-way Merging sort(记忆化搜索)
题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
- Simplest Python K-Way Merging Sort|最简单的Python k路归并排序
想做这个好长时间了,因为有一篇Dreamworks的论文<Coherent Out-of-Core Point-Based Global Illumination>提到了这个,一直没时间做 ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
随机推荐
- hibernate例子
首先下载好hibernate包 如果运行之后出现数据库连接错误 则重新把jar包位置放在web-inf的lib下面再addbulidpath 第一步:创建实体类 Hibernate要求实体类必须提供 ...
- 百度Apollo学习(一)
产品介绍 Nuvo-5095GC为工业电脑打开了新的篇章.作为首款面向CUDA计算.自动驾驶.深度学习及虚拟现实等新兴领域的嵌入式工控机,Nuvo-5095GC是一个高度集成.体积紧凑.稳定可靠的高性 ...
- Kaggle泰坦尼克数据科学解决方案
原文地址如下: https://www.kaggle.com/startupsci/titanic-data-science-solutions --------------------------- ...
- MyEclipse下自定义(支持html5的)JSP模板--JSP
需求:由于某些Mclipse版本发行的比较早,所以在有些版本(比如Mclipse2014,至于其他版本博主不知能不能创建html5格式的JSP页面)里创建JSP页面时html部分不是html5格式的. ...
- Linux文件系统管理
第九讲 文件系统管理 基础知识点: 硬盘的构成:主要由盘片.机械手臂.磁头与主轴马达所组成,实际的数据都是写在具有磁性物质上的盘片,通过主轴马达让盘片转动,机械手臂可伸展让磁头在盘片上读取数据 ...
- python基础之 025 模块加载与import的使用
内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...
- Python特点
用一种方法,最好只用一种方法来做一件事 1.面向对象(解决一个问题,先考虑由“谁”来做,怎么做是“谁”的职责) 函数.模块.数字.字符串都是对象 在Python中一切皆对象 完全支持继承.重载.多重继 ...
- csrf漏洞
漏洞原理:csrf全名为跨站请求伪造,是一种对网站的恶意利用,虽然听起来和xss很像,但是它们俩还是有很大的区别的.csrf是通过伪造来自受信任用户的请求来利用受信任的网站. 比如: 一个有csrf漏 ...
- python-day71--django多表双下划线查询及分组聚合及F/Q查询
#====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...
- Java环境下shiro的测试-认证与授权
Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...