排序僅僅有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根據題意 乙個很...