归并排序静态链表优化算法
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
//int a[100001];
vector<int> a;
vector<int> link;
//int link[100001];
int insertionSort(int start, int end)
{
// cout << "insert" << endl;
int head = start;
for (int i = start + 1; i <= end; i++)
{
if (a[i] <= a[head])
{
link[i] = head;
head = i;
}
else
{
int j = head;
while ((link[j] != -1) && (a[link[j]] <= a[i]))
j = link[j];
if (link[j] == -1)
link[j] = i;
else
{
link[i] = link[j];
link[j] = i;
}
}
}
return head;
}
int merge1(int q, int r)
{
int head;
if (a[q] > a[r])
{
head = r;
r = link[r];
}
else
{
head = q;
q = link[q];
}
int k = head;
int i = q, j = r;
while (i != -1 && j != -1)
{
if (a[i] < a[j])
{
link[k] = i;
k = i;
i = link[i];
}
else
{
link[k] = j;
k = j;
j = link[j];
}
}
if (i == -1)
{
link[k] = j;
}
else
{
link[k] = i;
}
return head;
}
int mergeSort1(int low, int high)
{
if (high - low + 1 < 16)
{
int p = insertionSort(low, high);
return p;
}
else
{
//cout << "test" << endl;
int mid = (low + high) / 2;
int q = mergeSort1(low, mid);
int r = mergeSort1(mid + 1, high);
return merge1(q, r);
}
}
int main()
{
cout << "input length" << endl;
int length = 0;
int begin = 0;
//15776 28666 15789 6124 22666
while (cin >> length && length != -1)
{
srand((unsigned)time(nullptr));
for (int i = 0; i < length; ++i)
{
a.push_back(rand());
// a[i] = rand();
}
// for (int j = 0; j < length; ++j) {
// cout << a[j] << ends;
// }
// cout << endl;
for (int i = 0; i < length; i++)
{
link.push_back(-1);
// link[i] = -1;
}
clock_t startTime1 = clock();
begin = mergeSort1(0, length - 1);
clock_t finishTime1 = clock();
double totalTime1 = (double)(finishTime1 - startTime1) * 1000 / CLOCKS_PER_SEC;
cout << "improved total time is " << totalTime1 << endl;
a.clear();
link.clear();
}
return 0;
}