一下内容主要参考了严蔚敏版的数据结构教材。
2路插入排序是对折半插入排序的进一步改进。它减少了折半插入排序中记录的移动次数,但是它需要和带排序的记录序列
k
0
,
k
1
,
k
2
,
.
.
.
,
k
n
−
1
k_0,k_1,k_2,...,k_{n-1}
k0,k1,k2,...,kn−1同样大小的n个记录空间(数组d)。具体做法是:首先将
k
0
k_0
k0复制到
d
[
0
]
d[0]
d[0],并将
d
[
0
]
d[0]
d[0]看做是一个已经有序的子序列的中间点。然后迭代待排序的记录中剩余的
n
−
1
n-1
n−1个记录,如果当前记录的关键字比
d
[
0
]
d[0]
d[0]小则将该关键字插入到
d
[
0
]
d[0]
d[0]之前的有序表中,否则将该关键字插入到
d
[
0
]
d[0]
d[0]之后的有序表中。在实现算法时将数组d看成是一个头尾相接的循环数组,并用指针
f
i
r
s
t
first
first和
f
i
n
a
l
final
final指向当前已经得到的有序序列的第一个元素和最后一个元素的位置。一个具体的例子如图1所示。
/* Function to print an array */
void printArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
cout << arr[i] << " ";
cout << endl;
}
void twoLineInsertSort(int arr[], int d[],int n)
{
int k = 0;
int first = 0;
int final = 0;
d[0] = arr[0];
for (int i = 1; i < n; i++)
{
// 待插入元素比最小的元素小
if (arr[i] < d[first])
{
first = (first - 1 + n) % n;
d[first] = arr[i];
}
// 待插入元素比最大元素大
else if (arr[i] > d[final])
{
final = (final + 1 + n) % n;
d[final] = arr[i];
}
// 插入元素比最小大,比最大小,,这一部分使用的策略是直接插入排序的策略
else
{
k = (final + 1 + n) % n;
while (d[((k - 1) + n) % n] > arr[i])
{
d[k] = d[(k - 1 + n) % n];
k = (k - 1 + n) % n;
}
d[k] = arr[i];
final = (final + 1 + n) % n;
}
}
for (int j = 0; j < n; j++)
{
arr[j] = d[(first + j+n) % n];
}
return;
void twoLineInsertSort(int arr[], int d[],int n)
{
int k = 0;
int first = 0;
int final = 0;
d[0] = arr[0];
int low = 0;
int high = 0;
int length = 0;
int mid = 0;
for (int i = 1; i < 7; i++)
{
if (i == 6)
{
cout << "d[first]" << d[first] << endl;
cout << "d[final]=" << d[final] << endl;
}
// 待插入元素比最小的元素小
if (arr[i] < d[first])
{
first = (first - 1 + n) % n;
d[first] = arr[i];
}
// 待插入元素比最大元素大
else if (arr[i] >= d[final])
{
final = (final + 1 + n) % n;
d[final] = arr[i];
}
// 插入元素比最小大,比最大小,这里使用的是折半插入的策略可以减少关键字比较的次数
else
{
low = first;
high = final;
while (low != high) //折半查找
{
length = (high - low + n) % n; //元素个数
mid = (low + length / 2+n) % n; //中间位置
if (arr[i] < d[mid])
high = (mid-1+n)%n;
else
low = (mid + 1+n) % n;
}
if (i == 6)
{
cout << "high=" << high << endl;
cout << "low=" << low << endl;
}
for (int k = (final + 1+n)%n; k != low; k = (k - 1 + n) % n) //移动元素
d[k] = d[(k - 1 + n) % n];
d[low] = arr[i];
final= (final + 1 + n) % n;
}
}
for (int j = 0; j < n; j++)
{
arr[j] = d[(first + j+n) % n];
}
return;
}
//测试程序
int main()
{
int arr[] = { 10, 7, 8, 9, 1, 5 };
int d[6] = { 0 };
int n = sizeof(arr) / sizeof(arr[0]);
twoLineInsertSort(arr, d, n );
cout << "Sorted array: \n";
printArray(arr, n);
return 0;
}