待字閨中之巧妙排序分析

2021-09-07 05:52:32 字數 1540 閱讀 9825

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

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

211332p1

p2p3

如果,我們有三個指標: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,p2

p3 交換之後,p2繼續從p1開始。假設是2繼續遍歷。假設是1或者3,反覆上面的步驟,所得例如以下:11

2332

p1,p2

p3 依據上面的方法繼續下去11

2233

p1p3

p2 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根據題意 乙個很...