幾種常見(jiàn)的排序算法的java實(shí)現(xiàn)

首先看一下排序的定義:

排序轨功,就是重新排列表中的元素汗茄,使表中的元素滿(mǎn)足按關(guān)鍵字遞增或遞減的過(guò)程彩掐。為了查找方便,通常需要計(jì)算機(jī)中的表示按關(guān)鍵字有序的枫匾。

接著是算法的穩(wěn)定性:

若待排序表中有兩個(gè)元素Ri和Rj架诞,其對(duì)應(yīng)的關(guān)鍵字keyi=keyj,且在排序前Ri在Rj前面干茉,若使用某一排序算法后谴忧,Ri仍然在Rj前面,則稱(chēng)這個(gè)排序算法是穩(wěn)定的角虫,否則稱(chēng)這個(gè)排序算法是不穩(wěn)定的沾谓。需要注意的是,算法是否具有穩(wěn)定性并不能衡量一個(gè)算法的優(yōu)劣戳鹅,它主要是對(duì)算法的性質(zhì)進(jìn)行描述均驶。

一、插入排序

插入排序是一種簡(jiǎn)單直觀的排序方法枫虏,其基本思想是每次將一個(gè)待排序的記錄按其關(guān)鍵字大小插到前面已排好的子序列中妇穴,直到全部記錄插入完成。
由插入排序的思想可以引申出三個(gè)重要的排序算法:直接插入排序隶债、折半插入排序和希爾排序腾它。

1、直接插入排序

簡(jiǎn)單粗暴的代碼先上??

void insert_sort(int s[]) {
        int temp = 0;
        for (int i = 1; i < s.length; i++) {
            if (s[i] < s[i - 1]) {
                temp = s[i];
                while(i>0 && temp<s[i-1]){
                    s[i]=s[i-1];
                    i--;
                }
                s[i]=temp;
            }
        }
    }

空間復(fù)雜度O(1)死讹,時(shí)間復(fù)雜度為O(n2)瞒滴,是一個(gè)穩(wěn)定排序方法,適用于順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)的線性表赞警。

2逛腿、折半插入排序

折半插入排序(Binary Insertion Sort)是對(duì)插入排序算法的一種改進(jìn),所謂排序算法過(guò)程仅颇,就是不斷的依次將元素插入前面已排好序的序列中单默。
排序思想:有一組數(shù)據(jù)待排序,排序區(qū)間為Array[0] ~ Array[n-1]忘瓦。將數(shù)據(jù)分為有序數(shù)據(jù)和無(wú)序數(shù)據(jù)搁廓,第一次排序時(shí)默認(rèn)Array[0]為有序數(shù)據(jù)引颈,Array[1] ~ Array[n-1]為無(wú)序數(shù)據(jù)。有序數(shù)據(jù)分區(qū)的第一個(gè)元素位置為low境蜕,最后一個(gè)元素的位置為high蝙场。
遍歷無(wú)序區(qū)間的所有元素,每次取無(wú)序區(qū)間的第一個(gè)元素Array[i]粱年,因?yàn)? ~ i-1是有序排列的售滤,所以用中點(diǎn)m將其平分為兩部分,然后將待排序數(shù)據(jù)同中間位置為m的數(shù)據(jù)進(jìn)行比較台诗,若待排序數(shù)據(jù)較大完箩,則low~m-1分區(qū)的數(shù)據(jù)都比待排序數(shù)據(jù)小,反之拉队,若待排序數(shù)據(jù)較小弊知,則m+1 ~ high分區(qū)的數(shù)據(jù)都比 待排序數(shù)據(jù)大,此時(shí)將low或high重新定義為新的合適分區(qū)的邊界粱快,對(duì)新的小分區(qū)重復(fù)上面操作秩彤。直到low和high 的前后順序改變,此時(shí)high+1所處位置為待排序數(shù)據(jù)的合適位置事哭。

下面是代碼:

void half_insert_sort(int s[]) {
        int i,j,low,high,mid;
        int temp;
        for (i = 1; i < s.length; i++) {
            temp = s[i];
            low = 0;
            high = i-1;
            while (low <= high) {
                mid = (low + high) / 2;
                if(s[mid]>temp) high = mid - 1;
                else low = mid + 1;
            }
            for (j = i - 1; j >= high + 1; --j) s[j + 1] = s[j];
            s[high+1]=temp;
        }
    }

折半插入排序僅減少了比較元素的次數(shù)漫雷,約為O(nlog2n),時(shí)間復(fù)雜度O(n2)鳍咱,空間復(fù)雜度O(1)降盹,是一個(gè)穩(wěn)定排序方法。

3流炕、希爾排序

希爾排序的基本思想是:先將排序表分割成若干形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,分別進(jìn)行插入排序仅胞,當(dāng)整個(gè)表中的元素已呈“基本有序”時(shí)每辟,再對(duì)全體記錄進(jìn)行一次直接插入排序。

代碼如下:

void ShellSort(int s[]) {
        int n = s.length;
        int dk;
        int temp;
        int i,j;
        for (dk = n / 2; dk >= 1; dk = dk / 2) {
            for (i = dk; i < n; i++) {
                if(s[i]<s[i-dk]){
                    temp = s[i];
                    for (j = i - dk; j >=0 && temp<=s[j]; j -= dk) {
                        s[j+dk]=s[j];
                    }
                    s[j+dk]=temp;
                }
            }
        }
    }

該算法空間復(fù)雜度O(1)干旧,時(shí)間復(fù)雜度O(n2)渠欺,不穩(wěn)定,僅適用于線性表為順序存儲(chǔ)的情況椎眯。

二挠将、交換排序

所謂交換,是指根據(jù)序列中兩個(gè)關(guān)鍵字的比較結(jié)果來(lái)對(duì)換這兩個(gè)記錄在序列中的位置编整,基于交換的排序算法很多舔稀,主要有冒泡排序和快速排序。

1掌测、冒泡排序

冒泡排序的基本思想是:假設(shè)待排序表長(zhǎng)為n内贮,從后往前(或從前往后)兩兩比較相鄰元素的值,若為逆序(即A[i-1]>A[i]),則交換他們夜郁,直到序列比較完什燕。我們稱(chēng)它為一趟冒泡,結(jié)果是將最小的元素交換到待排序列的第一個(gè)位置竞端。下一趟排列時(shí)屎即,前一趟確定的最小元素不再參加比較,待排序列減少一個(gè)元素事富,每趟冒泡的結(jié)果就是把序列中的最小元素放到了最終的位置技俐,這樣最多做n-1趟冒泡就能把所有元素排好序。

算法代碼如下:

void BubbleSort(int s[]) {
        int temp;
        for(int i=0;i<s.length-1;i++){ //遍歷數(shù)組長(zhǎng)度的次數(shù)
            for(int j=0;j<s.length-i-1;j++){
                if(s[j]>s[j+1]){
                    temp=s[j];
                    s[j]=s[j+1];
                    s[j+1]=temp;
                }
            }
        }
    } //向后冒泡

void Bubble(int s[]) {
        int temp;
        for (int i = 0; i < s.length-1; i++) {
            for(int j=s.length-1;j>i;j--){
                if(s[j]<s[j-1]){
                    temp = s[j];
                    s[j] = s[j - 1];
                    s[j - 1] = temp;
                }
            }
        }
    } //向前冒泡

以上包含了向前冒泡和向后冒泡赵颅∷淞恚空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O(n2)饺谬,是一種穩(wěn)定的排序方法捂刺。

2、快速排序

快速排序是很重要的排序方法募寨,面試中經(jīng)常會(huì)問(wèn)族展。快速排序是對(duì)冒泡排序的一種改進(jìn)拔鹰,其基本思想是分治仪缸,更多詳細(xì)內(nèi)容請(qǐng)戳:https://www.runoob.com/w3cnote/quick-sort.html

下面是實(shí)現(xiàn)代碼:

void quick_sort(int s[], int low, int high)
    {
        if (low < high)
        {
            int i = low, j = high, x = s[low];
            while (i < j)
            {
                while(i < j && s[j] >= x) // 從右向左找第一個(gè)小于x的數(shù)
                    j--;  
                if(i < j) 
                    s[i++] = s[j];
                
                while(i < j && s[i] < x) // 從左向右找第一個(gè)大于等于x的數(shù)
                    i++;  
                if(i < j) 
                    s[j--] = s[i];
            }
            s[i] = x;
            quick_sort(s, low, i - 1); // 遞歸調(diào)用
            quick_sort(s, i + 1, high);
        }
    }

對(duì)算法的最好理解方式是手動(dòng)地模擬一遍這些算法
該算法空間復(fù)雜度最壞情況下是O(n),在平均情況下是O(log2n)列肢,時(shí)間復(fù)雜度為O(n2)恰画,是一個(gè)不穩(wěn)定的排序方法。
注:在快速排序算法中瓷马,并不產(chǎn)生有序子序列拴还,但每趟排序后悔將一個(gè)元素(基準(zhǔn)元素)放到其最終的位置上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欧聘,一起剝皮案震驚了整個(gè)濱河市片林,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怀骤,老刑警劉巖费封,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蒋伦,居然都是意外死亡弓摘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)痕届,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衣盾,“玉大人寺旺,你說(shuō)我怎么就攤上這事∈凭觯” “怎么了阻塑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)果复。 經(jīng)常有香客問(wèn)我陈莽,道長(zhǎng),這世上最難降的妖魔是什么虽抄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任走搁,我火速辦了婚禮,結(jié)果婚禮上迈窟,老公的妹妹穿的比我還像新娘私植。我一直安慰自己,他們只是感情好车酣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布曲稼。 她就那樣靜靜地躺著,像睡著了一般湖员。 火紅的嫁衣襯著肌膚如雪贫悄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天娘摔,我揣著相機(jī)與錄音窄坦,去河邊找鬼。 笑死凳寺,一個(gè)胖子當(dāng)著我的面吹牛鸭津,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肠缨,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逆趋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了怜瞒?” 一聲冷哼從身側(cè)響起父泳,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤般哼,失蹤者是張志新(化名)和其女友劉穎吴汪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒸眠,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漾橙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楞卡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霜运。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脾歇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘捡,到底是詐尸還是另有隱情藕各,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布焦除,位于F島的核電站激况,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膘魄。R本人自食惡果不足惜乌逐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望创葡。 院中可真熱鬧浙踢,春花似錦、人聲如沸灿渴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逻杖。三九已至奋岁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荸百,已是汗流浹背闻伶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留够话,地道東北人蓝翰。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像女嘲,于是被迫代替她去往敵國(guó)和親畜份。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)欣尼,會(huì)觸發(fā)此異常爆雹。 O...
    我想起個(gè)好名字閱讀 5,249評(píng)論 0 9
  • 常用排序算法總結(jié) 概述 在計(jì)算機(jī)科學(xué)中,排序算法是一種重要的操作愕鼓。合理的排序算法能夠大幅度提高計(jì)算機(jī)處理數(shù)據(jù)的性能...
    lazydecoder閱讀 4,305評(píng)論 4 12
  • 總結(jié)一下常見(jiàn)的排序算法钙态。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序菇晃。外排序:指在排序...
    jiangliang閱讀 1,334評(píng)論 0 1
  • 排序算法說(shuō)明 (1)排序的定義:對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序册倒; 輸入:n個(gè)數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 653評(píng)論 0 0
  • 2017/10/26 再聽(tīng)曉蕓老師上課 這兩天,向日葵教室出了一點(diǎn)小狀況:幾個(gè)孩子的情緒很難控制磺送,課堂推進(jìn)稍顯艱難...
    MS常閱讀 815評(píng)論 0 5