待字閨中之巧妙排序分析

2021-06-22 19:26:55 字數 1520 閱讀 2594

排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。

分析:這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o(nlogn),顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看下面的方法,我們首先通過例子來說明: 2

1133

2p1p2p3

假設,我們有三個指標:p1、p2、p3.p1從左側開始,指向第乙個非1的數字;p3從右側開始,指向第乙個非3的數字。p2從p1開始遍歷,如果是2,p2繼續遍歷,直到p2遇到1或者3:

如果遇到1,則和p1進行交換,然後p1向右,指向第乙個非1的數字

如果遇到3,則和p3進行交換,然後p3向左,指向第乙個非3的數字12

1332

p1,p2p3

交換之後,p2繼續從p1開始,如果是2繼續遍歷,如果是1或者3,重複上面的步驟,所得如下:11

2332

p1,p2p3

根據上面的方法繼續下去11

2233

p1p3p2

p2在p3右側,演算法結束。具體**如下:

void sortwiththreepointer(vector& data)//用三個指標進行排序,缺點,只能對三個數有效

else if(data[cur] == 3)

else cur ++;

}}

基於快排劃分的思路

上面的思路,是針對三個數的,如果有更多的數,怎麼處理呢?比如,4個,5個等等。下面根據快速的排序的啟發,介紹一種演算法,儘管在處理三個數的時候,比較次數會多些,但,具有很好的通用性。

思路來自快排的劃分部分,快排的劃分部分:給定pivot,然後將資料劃分為<=pivot和》pivot兩部分。這樣,三個數字時,需要兩次劃分:

第一次,用1作為pivot,劃分1到最左邊;

第二次,用2作為pivot,劃分2到左邊,則得到整體的排序。

具體**如下:

int partition(vector& data,int provit,int begin,int end)

} if(i == end+1)return begin-1;

while(begin < end)

data[begin] = provit;

return begin;

}//numbers是已經排好序的可能會出現的數字,如1,2,3,對每乙個數字進行partition

void sortwithpartition(vector& data,vector& number)

;//100以內的素數

int datalen = data.size(),numberlen = number.size();

if(datalen <= 0 || numberlen <= 0 || numberlen >= 25)return;

maphashmap;

int i,j=0,product = 1;

for(i=0;i

待字閨中之巧妙排序分析

排序僅僅有1。2,3三個元素的陣列。不能統計1,2。3的個數。分析 這個題目,雖然也是排序,但卻不能使用高速排序的方法。僅僅有三個元素,假設時間複雜度仍舊是o nlogn 顯然不是最好的。那就行使用線性的排序演算法,比如計數排序。但是題目中要求,不可以對1,2,3進行統計個數。那該怎樣處理呢?請大家...

待字閨中之兄弟數字分析

給定乙個數x,他的兄弟數y定義為 是由x中的數字組合而成。而且y是大於x的數中最小的。比如,38276的兄弟數字為38627。給定x,求y。分析 這個題目當然有暴力的方法。列出全部的排列組合。然後然後找到大於x中,最小的y。即。找到兄弟數字。那有沒有更好的方法呢?不想對全部情況進行窮舉。就要想辦法,...

待字閨中之樹的高度分析

有乙個棵樹,不一定是二叉樹,有n個節點,編號為0到n 1。有乙個陣列a,陣列的索引為0到n 1,陣列的值a i 表示節點i的父節點的id,根節點的父節點id為 1。給定陣列a,求得樹的高度。分析這個題目我們首先把陣列寫出來,然後進一步分析,就很明了了,如下例子 333 1201234根據題意 乙個很...