向量中的一些算法實(shí)現(xiàn)

對(duì)于向量或者數(shù)組這種數(shù)據(jù)結(jié)構(gòu)摄杂,除了常常用到的增坝咐,改,刪析恢,除元素之外墨坚,還會(huì)涉及到一些其他操作,特此做以下總結(jié):

參考教材:《數(shù)據(jù)結(jié)構(gòu) C++語(yǔ)言版》鄧俊輝著

為了算法實(shí)現(xiàn)映挂,定義一個(gè)模板類(lèi)如下所示;


template <typename T>

class MyVector
{
private:

    int my_size;  //向量當(dāng)前大小
    T *elem;       //存放數(shù)據(jù)
    
public:
    void uniquify(); //去重復(fù)元素
    int binSearchA(T const& e,int lo,int hi) const;
    int binSearchB(T const &e, int lo, int hi) const;
    int binSearchC(T const &e, int lo, int hi) const;
    void bubbleSort(int lo, int hi);
    bool bubble(int lo, int hi);
};

1. 去重復(fù)元素

對(duì)于一個(gè)向量或者數(shù)組來(lái)說(shuō)泽篮,可能存在者若干重復(fù)元素,對(duì)于一個(gè)有序向量柑船,重復(fù)元素的去除帽撑,可以用以下C++代碼實(shí)現(xiàn):


template <typename T>
void MyVector<T>::uniquify()
{
    int i,j=0 //用i記錄不重復(fù)元素,用j遍歷當(dāng)前向量
    while(++j<my_size)
    {
        if(elme[j]!=elem[i])
        {
            elem[++i] = elem[j];
        }
        my_size = i;
        i++;
    }

}

如以上代碼所示鞍时,去除一個(gè)有序向量的重復(fù)元素亏拉,其過(guò)程如下圖所示:


2. 二分查找算法及改進(jìn)

  • A版算法
    對(duì)于向量中某一元素的查找,除了順序查找之外逆巍,對(duì)于有序向量及塘,可以使用二分查找,常規(guī)二分查找的算法實(shí)現(xiàn)如下所示:

template <typename T>
int MyVector<T>::binSearchA(const T &e, int lo, int hi) const  //在區(qū)間查找
{
    while(lo<hi)
    {
        int mi = (lo + hi) >> 1;
        if(e<elem[mi])
        {
            hi = mi;
        }
        if(e>elem[mi])
        {
            lo = mi;
        }else
        {
            return mi;
        }
        
    }
    return -1;
}

二分查找算法A版的實(shí)現(xiàn)可以由上代碼所示锐极,經(jīng)過(guò)多次比較笙僚,直到找到元素,返回其下標(biāo)溪烤。

  • B版算法
template <typename T>
int MyVector<T>::binSearchB(const T &e, int lo, int hi) const
{
    while(1<hi-lo)
    {
        int mi = (lo + hi) >> 1;
        (e < elem[mi]) ? hi = mi : lo = mi;
    }
    return (e = elme[mi]?lo:-1)
}

與二分查找A版算法相比味咳,該算法只經(jīng)過(guò)一次比較庇勃,不斷通過(guò)一次比較檬嘀,更新左右區(qū)間,找到對(duì)應(yīng)元素之后责嚷,也不返回鸳兽,直到比較的區(qū)間縮小至1時(shí),停止比較罕拂。與上一版算法相比揍异,盡管最好情況下的算法性能有所下降全陨,但是最壞情況下的算法性能有所上升。

  • C版算法

A版算法與C版算法雖然能夠成功的查找到元素的位置衷掷,但是仍然存在其局限性辱姨,當(dāng)存在重復(fù)元素時(shí),按照某種優(yōu)先級(jí)會(huì)返會(huì)較為靠后的元素戚嗅,改進(jìn)后的C版查找算法如下所示:

template <typename T>
int MyVector<T>::binSearchC(T const &e, int lo, int hi) const
{
    while(lo<hi)
    {
        int mi = (lo + hi) >> 1;
        (elem[mi]<e?):lo=mi+1:hi=mi;
    }

    return --lo;
}

以上算法實(shí)現(xiàn)中雨涛,結(jié)束循環(huán)的唯一條件是左右區(qū)間lo=hi,找到較為靠后的元素之后,lo-1就是較為靠后的元素的下標(biāo)懦胞。

3. 冒泡排序算法的一種新實(shí)現(xiàn)

以往在實(shí)現(xiàn)冒泡排序算法時(shí)替久,分為內(nèi)外兩次循環(huán),外層循環(huán)遍歷整個(gè)向量躏尉,而內(nèi)層循環(huán)則用來(lái)比較和交換元素蚯根,一種新的實(shí)現(xiàn)方法是可以將內(nèi)外兩層循環(huán)分開(kāi)實(shí)現(xiàn),具體實(shí)現(xiàn)如下代碼所示:


template <typename T>
void MyVector<T>::bubbleSort(int lo, int hi)
{
    while(!bubble(lo,hi--));
}
template <typename T>
bool MyVector<T>::bubble(int lo,int hi){

    bool sorted = true; //假定整體有序
    while(++lo<hi)
    {
        if(elem[lo-1]>elem[lo])
        {
            sorted = false;
            swap(elem[lo - 1], elem[lo]);
        }
    }

    return sorted;
}

整體實(shí)現(xiàn)代碼胀糜,如上所示颅拦,將內(nèi)外層循環(huán)分開(kāi)實(shí)現(xiàn),bubbleSort()相當(dāng)于實(shí)現(xiàn)了外層循環(huán)教藻,并且通過(guò)設(shè)置標(biāo)志位實(shí)現(xiàn)了交換矩距,整個(gè)代碼更加簡(jiǎn)潔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怖竭,一起剝皮案震驚了整個(gè)濱河市锥债,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊臭,老刑警劉巖哮肚,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異广匙,居然都是意外死亡允趟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)鸦致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潮剪,“玉大人,你說(shuō)我怎么就攤上這事分唾】古觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绽乔,是天一觀的道長(zhǎng)弧蝇。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么看疗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任沙峻,我火速辦了婚禮,結(jié)果婚禮上两芳,老公的妹妹穿的比我還像新娘摔寨。我一直安慰自己,他們只是感情好怖辆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布祷肯。 她就那樣靜靜地躺著,像睡著了一般疗隶。 火紅的嫁衣襯著肌膚如雪佑笋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天斑鼻,我揣著相機(jī)與錄音蒋纬,去河邊找鬼。 笑死坚弱,一個(gè)胖子當(dāng)著我的面吹牛蜀备,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荒叶,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碾阁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了些楣?” 一聲冷哼從身側(cè)響起脂凶,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愁茁,沒(méi)想到半個(gè)月后蚕钦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹅很,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年嘶居,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片促煮。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邮屁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菠齿,到底是詐尸還是另有隱情佑吝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布泞当,位于F島的核電站迹蛤,受9級(jí)特大地震影響民珍,放射性物質(zhì)發(fā)生泄漏襟士。R本人自食惡果不足惜盗飒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陋桂。 院中可真熱鬧逆趣,春花似錦、人聲如沸嗜历。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梨州。三九已至痕囱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暴匠,已是汗流浹背鞍恢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留每窖,地道東北人帮掉。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窒典,于是被迫代替她去往敵國(guó)和親蟆炊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容