1. 程式人生 > >DS-006 順序表-迴圈左移p位

DS-006 順序表-迴圈左移p位

0 1 2 3 4 5 6 7 8 9

迴圈左移4位:

4 5 6 7 8 9 0 1 2 3

 題目:設將n(n>1)個整數存放到一維陣列R中。設計一個在時間和空間兩方面儘可能高效的演算法。將R中的序列迴圈左移P(0<P<n)個位置,即將R中的資料由(x0,x1,…,xn-1)變換為(xp,Xp+1,…,Xn-1,x0,x1,…,Xp-1)。要求:
(1)給出演算法的基本設計思想。
(2)根據設計思想,用程式設計語言描述演算法,關鍵之處給出註釋。

(3)說明你設計演算法的時間複雜度和空間複雜度。

分析:

0 1 2 3 4 5 6 7 8 9

0~p-1位逆置,p~n-1位逆置:

3 2 1 0 9 8 7 6 5 4

整體逆置:

4 5 6 7 8 9 0 1 2 3

答:

(1)演算法思想:a代表前p個元素,b代表陣列中餘下的n-p個元素。可以將這個問題看成將陣列ab轉換成ba,現將a逆置得到a逆,再將b逆置得到b逆,最後整體逆置就得到了ba。(線性代數知識,DS-002 順序表--逆置所有元素有陣列逆置的實現)

(2)程式碼(這次不是虛擬碼):

void Reverse(int R[], from, to){
	int i, temp;
	for(i=0; i<(to-from+1)/2; i++){
		temp = R[from+i];
		R[from+i] = R[to-i];
		R[to-i] = temp;
	}
}
void Converse(int R[], int n, int p){
	Reverse(R, 0, p-1);
	Reverse(R, p, n-1);
	Reverse(R, 0, n-1);
}

(3)時間複雜度:Reverse(R, 0, p-1);執行了3*(p/2)步,Reverse(R, p, n-1);執行了3*(n-p)/2 ,Reverse(R, 0, n-1);執行了3*(n/2),共3n步。該演算法的時間複雜度O(n)

只用到了一個額外的temp變數,所需輔助空間為常量。該演算法空間複雜度為O(1)。