归并排序、二路归并排序
来源:互联网 发布:民生银行网络面试 编辑:程序博客网 时间:2024/05/22 23:08
#include<cstdlib>
#define MAX_LENGTH 100 //测试数据量
typedef int TYPE;
using namespace std;
template <typename T>
void ReMergerSort(T Array[], T TempArray[], int left, int right, int middle)//归并
{
int index1 = left, index2 = middle+1,j=left;
for (int i = left; i <= right; i++)
TempArray[i] = Array[i];
while (index1<=middle&&index2<=right)//保证左右集合均不越界
{
if (TempArray[index1] <= TempArray[index2])
Array[j++] = TempArray[index1++];
else Array[j++] = TempArray[index2++];
}
while (index1 <= middle)//如果左边集合剩余,则直接赋给Array数组
Array[j++] = TempArray[index1++];
while (index2 <= right)//如果右边集合剩余,则直接赋给Array数组 注意:左右两集合必定只有一个剩余
Array[j++] = TempArray[index2++];
}
template<typename T>
void MergerSort(T Array[], T TempArray[], int left, int right)//均分集合,递归至只剩一个元素,然后归并
{
if (left<right)
{
int middle = (left + right) / 2;
MergerSort(Array, TempArray, left, middle);
MergerSort(Array, TempArray, middle + 1, right);
ReMergerSort(Array, TempArray, left, right, middle);
}
}
int main()
{
TYPE Array[MAX_LENGTH] ;
for (int i = 0; i < MAX_LENGTH; i++)
{
Array[i] = (rand() % 10000);
}
TYPE TempArray[sizeof(Array) / sizeof(TYPE)];
for (int i = 0; i < sizeof(Array) / sizeof(TYPE); i++)
cout << Array[i] << " ";
cout << endl;
MergerSort(Array, TempArray, 0, sizeof(Array) / sizeof(TYPE)-1);
for (int i = 0; i < sizeof(Array) / sizeof(TYPE); i++)
cout << Array[i] << " ";
cout << endl;
return 0;
}
//二路归并
#include<iostream>
#include<cstdlib>
#define THRESHOLD 28 //阈值
#define MAX_LENGTH 100 //测试数据量
typedef float TYPE;
using namespace std;
template<typename T> //模板
void InsertSort(T Array[], int n) //小于等于阈值时插入排序
{
for (int i = 1; i < n; i++)
{
int j = i - 1;
TYPE temp = Array[i];
while (j>=0 && Array[j]>temp)
{
Array[j + 1] = Array[j];
j--;
}
Array[j + 1] = temp;
}
}
template <typename T>
void ReMergerSort(T Array[], T TempArray[], int left, int right, int middle)//归并
{
int index1 = left, index2 = right,j=left;
for (int i = left; i <= middle; i++)//左集合
TempArray[i] = Array[i];
for (int i = 1; i <= right - middle; i++)//右集合 注意右集合TempArray数组是由大到小
TempArray[right + 1 - i] = Array[middle + i];
while(j<=right)//遍历一次便可
{
if (TempArray[index1] <= TempArray[index2])
Array[j++] = TempArray[index1++];
else Array[j++] = TempArray[index2--];
}
}
template<typename T>
void MergerSort(T Array[], T TempArray[], int left, int right) // 均分集合,递归至只剩一个元素,然后归并
{
if (right - left + 1>THRESHOLD)
{
int middle = (left + right) / 2;
MergerSort(Array, TempArray, left, middle);
MergerSort(Array, TempArray, middle + 1, right);
ReMergerSort(Array, TempArray, left, right, middle);
}
else InsertSort(&Array[left], right - left + 1);
}
int main()
{
TYPE Array[MAX_LENGTH] ;
for (int i = 0; i < MAX_LENGTH; i++)
{
Array[i] = (rand() % 10000)/10.0;
}
TYPE TempArray[sizeof(Array) / sizeof(TYPE)];
for (int i = 0; i < sizeof(Array) / sizeof(TYPE); i++)
cout << Array[i] << " ";
cout << endl;
MergerSort(Array, TempArray, 0, sizeof(Array) / sizeof(TYPE)-1);
for (int i = 0; i < sizeof(Array) / sizeof(TYPE); i++)
cout << Array[i] << " ";
cout << endl;
return 0;
}
- 归并排序:二路归并
- 归并排序--二路归并
- 归并排序、二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 推荐几本javascript与jquery的好书
- Apache Windows下关闭启动以及修改服务端口
- hadoop全套免费视频
- 解决跨浏览器读取XML文件的方法
- LeetCode | Two Sum
- 归并排序、二路归并排序
- leetcode#121 Best Time to Buy and Sell Stock
- gsoap中文乱码及内存清理等问题的解决方案
- 用Wordpress构建App更新和反馈平台(下)
- Java I/O : Bit Operation 位运算
- BZOJ3680 吊打XXX(模拟退火算法)
- 6.5android 自定义相机,以及部分手机系统相机的bug
- Linux 程序开发打印 Debug 信息的使用技巧
- 一个平庸程序员的自白