2018-05-02 排序算法學(xué)習(xí)

排序算法

冒泡排序

實(shí)現(xiàn)思路:

  • 兩兩比較相鄰的關(guān)鍵碼,如果反序則交換格了,直到?jīng)]有反序的記錄

快速排序

實(shí)現(xiàn)思路:

  • 快速排序算是對(duì)冒泡排序算法的改進(jìn),從記錄序列的兩端向中間進(jìn)行

兩者的區(qū)別


由于冒泡排序是對(duì)相鄰的數(shù)據(jù)進(jìn)行兩兩比較,元素的移動(dòng)次數(shù)和比較次數(shù)都比較多析藕,而快速排序是從記錄序列的兩端向中間進(jìn)行,所以在元素的移動(dòng)次數(shù)和比較次數(shù)上都減少了


冒泡排序使用兩層循環(huán)嵌套凳厢,具體代碼省略
具體實(shí)現(xiàn)快速排序算法:

public static void sortCore(int[] array,int startIndex,int endIndex) {
        if(startIndex>=endIndex) {
            return;
        }
        
        int boundary=boundary(array,startIndex,endIndex);//選擇劃分的Index值
        //遞歸調(diào)用账胧,對(duì)數(shù)組兩部分排序
        sortCore(array,startIndex,boundary-1);
        sortCore(array,boundary+1,endIndex);
    }

    private static int boundary(int[] array, int startIndex, int endIndex) {
        int standard=array[startIndex];//定義標(biāo)準(zhǔn),一般取首值先紫、中值或末值
        int leftIndex=startIndex;//左指針
        int rightIndex=endIndex;//右指針
        while(leftIndex<rightIndex) {
            while(leftIndex<rightIndex&&array[rightIndex]>=standard) {
                rightIndex--;//找出右半部分小于標(biāo)準(zhǔn)的Index值
            }
            array[leftIndex]=array[rightIndex];//把小于的值賦值到左半部分
            while(leftIndex<rightIndex&&array[leftIndex]<=standard) {
                leftIndex++;//找出左半部分大于標(biāo)準(zhǔn)的Index值
            }
            array[rightIndex]=array[leftIndex];//賦值到右邊
        }
        array[leftIndex]=standard;//標(biāo)準(zhǔn)值賦給左邊
        return leftIndex;//返回新的劃分Index值
    }

選擇排序

  • 每趟排序在當(dāng)前待排序序列中選出關(guān)鍵碼最小的記錄治泥,添加到有序序列中
  • 特點(diǎn)是記錄的移動(dòng)次數(shù)少
    inti,j;
    for(i=0;i<r.length-1;i++){//對(duì)n個(gè)記錄進(jìn)行n-1趟的選擇排序
        index=i;//初始化第i趟選擇排序的最小記錄的指針
        for(j=i+1;j<r.length;j++){//在無(wú)序區(qū)選取最小記錄
            if(r[j]<r[index]){
                index=j;
            }
        }
        if(index!=i){//將最小記錄與r[i]交換
            temp=r[i];
            r[i]=r[index];
            r[index]=temp;
        }
    }

幾種排序算法的比較和選擇

  • 選取排序方法需要考慮的因素:待排序元素?cái)?shù)量n、元素分布情況遮精、元素信息量大小居夹、使用的語(yǔ)言工具

小結(jié)

  1. 若n較小(n <= 50),則可以采用直接插入排序或直接選擇排序本冲。由于直接插入排序所需的記錄移動(dòng)操作較直接選擇排序多准脂,因而當(dāng)記錄本身信息量較大時(shí),用直接選擇排序較好檬洞。
  2. 若文件的初始狀態(tài)已按關(guān)鍵字基本有序意狠,則選用直接插入或冒泡排序?yàn)橐恕?/li>
  3. 若n較大,則應(yīng)采用時(shí)間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序疮胖』犯辏快速排序是目前基于比較的內(nèi)部排序法中被認(rèn)為是最好的方法闷板。
  4. 在基于比較排序方法中,每次比較兩個(gè)關(guān)鍵字的大小之后院塞,僅僅出現(xiàn)兩種可能的轉(zhuǎn)移遮晚,因此可以用一棵二叉樹(shù)來(lái)描述比較判定過(guò)程,由此可以證明:當(dāng)文件的n個(gè)關(guān)鍵字隨機(jī)分布時(shí)拦止,任何借助于"比較"的排序算法县遣,至少需要O(nlog2n)的時(shí)間。
  5. 當(dāng)記錄本身信息量較大時(shí)汹族,為避免耗費(fèi)大量時(shí)間移動(dòng)記錄萧求,可以用鏈表作為存儲(chǔ)結(jié)構(gòu)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顶瞒,一起剝皮案震驚了整個(gè)濱河市夸政,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榴徐,老刑警劉巖守问,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坑资,居然都是意外死亡耗帕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)袱贮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仿便,“玉大人,你說(shuō)我怎么就攤上這事攒巍√皆剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窑业,是天一觀的道長(zhǎng)钦幔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)常柄,這世上最難降的妖魔是什么鲤氢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮西潘,結(jié)果婚禮上卷玉,老公的妹妹穿的比我還像新娘。我一直安慰自己喷市,他們只是感情好相种,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著品姓,像睡著了一般寝并。 火紅的嫁衣襯著肌膚如雪箫措。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天衬潦,我揣著相機(jī)與錄音斤蔓,去河邊找鬼。 笑死镀岛,一個(gè)胖子當(dāng)著我的面吹牛弦牡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漂羊,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驾锰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了走越?” 一聲冷哼從身側(cè)響起椭豫,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎买喧,沒(méi)想到半個(gè)月后捻悯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匆赃,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淤毛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了算柳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片低淡。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬项,靈堂內(nèi)的尸體忽然破棺而出蔗蹋,到底是詐尸還是另有隱情,我是刑警寧澤囱淋,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布猪杭,位于F島的核電站,受9級(jí)特大地震影響妥衣,放射性物質(zhì)發(fā)生泄漏皂吮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一税手、第九天 我趴在偏房一處隱蔽的房頂上張望蜂筹。 院中可真熱鬧,春花似錦芦倒、人聲如沸艺挪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麻裳。三九已至口蝠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掂器,已是汗流浹背亚皂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留国瓮,地道東北人灭必。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乃摹,于是被迫代替她去往敵國(guó)和親禁漓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 概述 排序有內(nèi)部排序和外部排序孵睬,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序播歼,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,191評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序掰读,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序秘狞,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,262評(píng)論 0 2
  • 一蹈集、 單項(xiàng)選擇題(共71題) 對(duì)n個(gè)元素的序列進(jìn)行冒泡排序時(shí)烁试,最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,093評(píng)論 0 10
  • iii.run輸入一個(gè)整數(shù)拢肆,輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)减响。其中負(fù)數(shù)用補(bǔ)碼表示。 題目 實(shí)現(xiàn)一個(gè)函數(shù)郭怪,輸入一個(gè)整數(shù)支示,...
    mmmwhy閱讀 1,253評(píng)論 1 0