又見排序;及陣列和分析

紫鳳發表於2013-09-10

今日面試題:又見排序

給定大小為n的陣列A,A中的元素有正有負。請給出方法,對其排序,保證:

1. 負數在前面,正數在後面

2. 正數之間相對位置不變

3. 負數之間相對位置不變

能夠做到時間複雜度為O(n),空間複雜度為O(1)麼?

=======================================================

陣列和分析

原題

有陣列A={5,3,8,9,16},第一次遍歷有:A = {3-5,8-3,9-8,16-9}={-2,5,1,7},陣列中元素和為-2+5+1+7=11;第二次遍歷有:A = {5-(-2),1-5,7-1}={7,-4,6},元素和為9. 給定陣列A,求第n次遍歷之後,陣列中元素的和。

分析

處理這樣的題目,如果沒有直接知道相關的原理,可以自己走一下一些具體的例子,這樣就可以發現一些規律,根據這些規律,再去聯想解決的完整方法。

經過觀察,我們可以發現:

  • 對於第k次遍歷而言,x_k_1、x_k_2、...、x_k_m,sum = x_k_m - x_k_1

也就是說,第k次遍歷結果的和,只與第一個和最後一個元素先關。下面,就來討論,如何求得第一個和最後一個元素。 我們看題目中的例子,先考慮第一個元素的變化

  • 第一次遍歷 k = 1時:-2=3-5

  • 第二次遍歷 k = 2時:7=5-(-2)=(8-3)-(3-5)=8-2*3+5

  • 第三次遍歷 k = 3時:-11=-4-7=(1-5)-(5-(-2)) = ((9-8)-(8-3)) - ((8-3)-(3-5))=9-3*8+3*3-5

分析到此,想必大家已經能夠明白這其中的規律,其實就是楊輝三角,老外叫帕斯卡三角。最後一個節點是類似的。而且,真個方法的時間複雜度與遍歷的次數n有關,與陣列的大小無關。

【注】楊輝三角,在楊輝的《九章算術》中有記載,那時還叫賈憲三角,只不過後來楊輝的名字非常大,漸漸叫楊輝三角的越來越多。

【分析完畢】

本文來自微信:待字閨中,2013-09-02釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章