归并排序、二路归并排序

来源:互联网 发布:民生银行网络面试 编辑:程序博客网 时间:2024/05/22 23:08
#include<iostream>
#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;
}

0 0
原创粉丝点击