兩段已序子數組 就地排序

問題描述

輸入:數組 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;
		}
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章