問題描述
輸入:數組 a,分成兩段;第一段長度爲 m,已序,第二段長度爲 n,已序
要求:將整個數組 a 排列爲全部有序,只使用一個臨時變量,即空間複雜度爲 O(1)
解決思路
設定數組 a[m+n],第一段爲 a[i], 0 < i < m-1;第二段爲 a[j], m < j < m+n-1。
方法:將第二段的元素依次插入到第一段已序的子數組中,即特殊的插入排序。
何時插入過程結束?
分兩種情況:
1、當第二段最後一個元素 a[m+n-1] 插到第一段中( j == m+n-1 )。這意味着第二段的全部元素均已插入。
2、當第二段一個元素 >= 第一段最後一個元素,相當於插入在當前位置,即位置不變( i == j-1 )。這意味着數組已經全部有序,無需對第二段還剩下的元素繼續插入。
源碼如下:
void sortInPlace (int *a, int m, int n)
{
int i, j, p, temp;
i = 0;
j = m;
while ( j < m + n &&
i < j )
{
if ( a[i] > a[j] )
{
temp = a[j];
for ( p = j; p > i; --p )
a[p] = a[p-1];
a[p] = temp;
++i;
++j;
}
else
{
++i;
}
}
}