递归实现
过程如图:
代码如下:
#include<iostream>
using namespace std;
//折半插入排序
void BInsertSort(int* &arr, int len)
{
int i;
int low, high;
int m;
for (i = 2; i <= len; i++)
{
arr[0] = arr[i]; //将arr[i]暂存到arr[0]
low = 1;
high = i - 1;
while (low <= high)
{
m = (low + high) / 2; //折半
if (arr[0] <= arr[m]) //插入位置在右半区
low = m + 1;
else //插入位置在左半区
high = m - 1;
}
for (int j = i - 1; j >= high + 1; --j)
{
arr[j + 1] = arr[j]; //向后移一位
}
arr[high + 1] = arr[0];//插入
for (int i = 1; i < len; i++)
cout << arr[i] << " ";
cout << arr[len] << endl;
}
}
//简单选择排序
void swap(int* &arr, int pos1, int pos2)
{
int temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
}
void SimpleChoiceSort(int* arr)
{
int len = arr[0];
int i;
for (i = 1; i <= arr[0]; i++)
{
int min = arr[i];
int pos = i;
for (int j = i + 1; j <= arr[0]; j++)
{
//找到最小数值,并保存其位置
if (arr[j] < min)
{
min = arr[j];
pos = j;
}
}
//把最小的放在前面
swap(arr, i, pos);
for (int i = 1; i < len; i++)
cout << arr[i] << " ";
cout << arr[len] << endl;
}
}
//二路归并排序(递归)
//
//将两个有序的数组合并为一个
void Merge(string * srr, string * trr, int i, int m, int n,int len)
{
//srr为需要归并的数组,trr为归并之后的数组,i到m为srr1的范围,m+1到n为srr2的范围
//注意:srr1和srr2并不是直接拆开的,拆开的是它们的指针
int j, k;
//i为srr1的指针,j为srr2的指针,k为trr的指针
for (j = m + 1, k = i; i <= m && j <= n; k++)
{
if (srr[i] > srr[j])
trr[k] = srr[i++];
else
trr[k] = srr[j++];
}
//将剩余部分的数组直接合并
if (i <= m)
{
for (int l = 0; l <= m - i; l++)
trr[k + l] = srr[i + l];
}
if (j <= n)
{
for (int l = 0; l <= n - j; l++)
trr[k + l] = srr[j + l];
}
}
void MSort(string* srr, string* trr1, int s, int t,int len)
{
//srr为需要拆分的数组,trr为拆分后需要合并保存的数组
//s为起始位置,t为终止位置,srr为需要
int m;
string* trr2 = new string[100];
cout << endl << s << " " << t << endl;
if (s == t)
{
trr1[s] = srr[s];
cout << trr1[s] <<endl;
}
else
{
m = (s + t) / 2; //一分为二
MSort(srr, trr2, s, m,len);
MSort(srr, trr2, m+1, t,len);
cout << "merge之前:" << endl;
cout << "起始位置:"<<s<<" 中间位置:"<<m<<" 结束位置:"<<t << endl;
for (int i = 1; i < len; i++)
cout << trr2[i] << " ";
cout << trr2[len] << endl;
Merge(trr2, trr1, s, m, t,len);
cout << "merge之后:" << endl;
//if (t == len)
//{
for (int i = 1; i < len; i++)
cout << trr1[i] << " ";
cout << trr1[len] << endl;
//}
}
}
void MergeSort(string* arr,int len)
{
MSort(arr, arr, 1, len,len);//起始位置为1,终止位置为len,需要拆分的数组为arr,需要合并的数组也为arr
//for (int i = 1; i < len; i++)
// cout << arr[i] << " ";
//cout << arr[len] << endl;
}
int main()
{
int times;
cin >> times;
while (times--)
{
int n;
cin >> n;
string* arr = new string[n + 3];
arr[0] = n;
for (int i = 1; i <= n; i++)
cin >> arr[i];
MergeSort(arr,n);
cout << endl;
}
}