Java之排序算法總結(jié)

排序

對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序啊掏。

  • 1蠢络、比較排序,時(shí)間復(fù)雜度O(nlogn) ~ O(n^2)迟蜜,主要有:冒泡排序刹孔,選擇排序,插入排序娜睛,歸并排序髓霞,堆排序,快速排序等畦戒。
  • 2方库、非比較排序,時(shí)間復(fù)雜度可以達(dá)到O(n)障斋,主要有:計(jì)數(shù)排序纵潦,基數(shù)排序徐鹤,桶排序等。

一邀层、Arrays類的排序

通常情況下我們可以使用Array.sort()來對(duì)數(shù)組進(jìn)行排序

  1. Array.sort(int[] a) 直接對(duì)數(shù)組進(jìn)行升序排序
  2. Array.sort(int[] a , int fromIndex, int toIndex) 對(duì)數(shù)組的從fromIndex到toIndex進(jìn)行升序排序

二返敬、排序算法

排序算法

1、冒泡排序

  • 算法思路:
    1被济、比較相鄰的元素救赐。如果第一個(gè)比第二個(gè)大涧团,就交換它們兩個(gè)只磷;
    2、對(duì)每一對(duì)相鄰元素作同樣的工作泌绣,從開始第一對(duì)到結(jié)尾的最后一對(duì)钮追,這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);
    3阿迈、針對(duì)所有的元素重復(fù)以上的步驟元媚,除了最后一個(gè);
    4苗沧、重復(fù)步驟1~3刊棕,直到排序完成。
  • 動(dòng)圖展示:
冒泡排序
  • 代碼體現(xiàn):
/*
*冒泡排序
*/
public static int[] bubbleSort(int[] array){
    if(array.length()==0){
        return array;
    }else{
        for(int i=0; i<array.length(); i++){
            for(int j=0; j<array.length-1-i; j++){
                if(array[j] > array[j+1]){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        return array;
    } 
} 

最佳情況:T(n) = O(n) 最差情況:T(n) = O(n2) 平均情況:T(n) = O(n2)

2待逞、選擇排序

表現(xiàn)最穩(wěn)定的排序算法之一甥角,因?yàn)?strong>無論什么數(shù)據(jù)進(jìn)去都是O(n2)的時(shí)間復(fù)雜度,所以用到它的時(shí)候识樱,數(shù)據(jù)規(guī)模越小越好嗤无。唯一的好處可能就是不占用額外的內(nèi)存空間了吧。理論上講怜庸,選擇排序可能也是平時(shí)排序一般人想到的最多的排序方法了吧当犯。

選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最懈罴病(大)元素嚎卫,存放到排序序列的起始位置,然后宏榕,再從剩余未排序元素中繼續(xù)尋找最型刂睢(大)元素,然后放到已排序序列的末尾担扑。以此類推恰响,直到所有元素均排序完畢。

  • 算法思路

    n個(gè)記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果涌献。具體算法描述如下:

    1胚宦、初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空;

    2枢劝、第i趟排序(i=1,2,3…n-1)開始時(shí)井联,當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當(dāng)前無序區(qū)中-選出關(guān)鍵字最小的記錄 R[k]您旁,將它與無序區(qū)的第1個(gè)記錄R交換烙常,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū);

    3鹤盒、n-1趟結(jié)束蚕脏,數(shù)組有序化了。

  • 動(dòng)圖展示

選擇排序
  • 代碼提現(xiàn)
/*
*選擇排序
*/
public static int[] selectionSort(int[] array){
    if(array.length==0){
        return array;
    }else{
        for(int i=0;i++;i<array.length()){
            int minIndex=i;
            for(int j=i;j++;j<array.length()){
                if(array[j]<array[minIndex]){
                    minIndex=j;//將最小數(shù)的索引保存
                }
            }
            int temp=array[minIndex];
            array[minIndex]=array[i];
            array[i]=temp;       
        }
        return array;
    } 
}

最佳情況:T(n) = O(n2) 最差情況:T(n) = O(n2) 平均情況:T(n) = O(n2)

3侦锯、快速排序

快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分驼鞭,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序尺碰,以達(dá)到整個(gè)序列有序挣棕。

  • 算法思路

    快速排序使用分治法來把一個(gè)串(list)分為兩個(gè)子串(sub-lists)。具體算法描述如下:

    1亲桥、從數(shù)列中挑出一個(gè)元素洛心,稱為 “基準(zhǔn)”(pivot);

    2题篷、重新排序數(shù)列词身,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)悼凑。在這個(gè)分區(qū)退出之后偿枕,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作户辫;

    3渐夸、遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

  • 動(dòng)圖展示

快速排序
  • 代碼提現(xiàn)
/*
* 快速排序
*/
public static int QuickSort(int[] array,int start,int end){
    if(array.length<1 || start<0 || end>array.length || start>end){
        return null;
    }else{
        int smallIndex=partation(array,start,end);
        if(smallIndex>start){
            QuickSort(array, start, smallIndex - 1);
        if (smallIndex < end)
            QuickSort(array, smallIndex + 1, end);
        return array;
        }
    }
}

//快速排序算法——partition
public static int partation(int[] array,int start,int end){
    int povit=(int)(start+Math.random()*(end-start+1));
    int smallIndex=start-1;
    swap(array,pivot,end);
    for(i=start;i<end;i++){
        if(array[i]<array[end]){
            smallIndex++;
            if(i>smallIndex){
                swap(array,i,smallIndex);
            }
        }
    }
    return smallIndex;
}

//交換數(shù)組內(nèi)兩個(gè)元素
 public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渔欢,一起剝皮案震驚了整個(gè)濱河市墓塌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件验庙,死亡現(xiàn)場離奇詭異闲昭,居然都是意外死亡缸血,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哀峻,你說我怎么就攤上這事涡相。” “怎么了剩蟀?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵催蝗,是天一觀的道長。 經(jīng)常有香客問我育特,道長丙号,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任缰冤,我火速辦了婚禮犬缨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锋谐。我一直安慰自己遍尺,他們只是感情好截酷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布涮拗。 她就那樣靜靜地躺著,像睡著了一般迂苛。 火紅的嫁衣襯著肌膚如雪三热。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天三幻,我揣著相機(jī)與錄音就漾,去河邊找鬼。 笑死念搬,一個(gè)胖子當(dāng)著我的面吹牛抑堡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朗徊,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼首妖,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了爷恳?” 一聲冷哼從身側(cè)響起有缆,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎温亲,沒想到半個(gè)月后棚壁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栈虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年袖外,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魂务。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曼验,死狀恐怖逆害,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚣驼,我是刑警寧澤魄幕,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站颖杏,受9級(jí)特大地震影響纯陨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留储,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一翼抠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获讳,春花似錦阴颖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帅矗,卻和暖如春偎肃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浑此。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工累颂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凛俱。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓紊馏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒲犬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朱监,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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