题目:
数组a[0,mid-1]和 a[mid,num-1],都分别有序。将其merge成有序数组a[0,num-1],要求空间复杂度O(1).
思想: eg:a[8] = { 2, 7, 9,10, 1, 3, 4, 8 }
则算法步骤为:
2>1,交换2,1, 1, 7, 9, 10, 2, 3, 4, 8 此时将 2 3 4 8 变成有序的,
7>2,交换7,2, 1, 2, 9, 10, 7, 3, 4, 8, 此时将 7 3 4 8 变成有序的,为 1, 2 ,9, 10, 3, 4, 7, 8
9>3,交换9,3, 1, 2, 3, 10, 9, 4, 7, 8, 此时将9,4,7,8变成有序的, 为 1, 2, 3, 10, 4, 7 , 8 , 9
10>4,交换10,4 1, 2, 3, 4, 10, 7, 8, 9, 此时将10,7,8,9变成有序的,为 1, 2, 3, 4, 7, 8, 9, 10
完毕;
代码如下:
void sort(int a[], int mid, int len)
{
int i = 0;
for (i = mid; i < len-1; ++i)
{
if (a[i]>a[i + 1])
{
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
void merge_E2(int a[], int mid, int len)
{ // 在上一个方法的基础上,当要求空间复杂度为O(1),如何设计算法
int i = 0;
int temp;
for (i = 0; i <= mid - 1; ++i)
{
if (a[i]>a[mid])
{
temp = a[i];
a[i] = a[mid];
a[mid] = temp;
sort(a, mid, len);
}
}
for (i = 0; i < len; i++)
{
cout << a[i] << ",";
}
}
void main()
{
const int size = 10;
int a[size] = { 2, 7, 9, 10,18, 1,2, 3, 4, 8 };
merge_E2(a, size/2, size);
}