++代碼實現 模糊綜合算法_干貨 | 十大經典排序算法最強總結(內含代碼實現)...

一、算法分類

十種常見排序算法可以分為兩大類:

比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此也稱為非線性時間比較類排序。

非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此也稱為線性時間非比較類排序。

c4dabbc90e51fbde5aae15d62b7ef8fa.png

二、算法復雜度

468d06c8af6e05c70afac48dac3365d3.png

三、算法相關概念

穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現在 b 的后面。

時間復雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什么規律。

空間復雜度:是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。

四、具體說明

1、冒泡排序

冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對于提升性能來說并沒有什么太大作用。

1、算法步驟

  • 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
  • 針對所有的元素重復以上的步驟,除了最后一個。
  • 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

2、動圖演示

50c5a3d29fa186c3c575692270254fe6.gif

3、什么時候最快

當輸入的數據已經是正序時(都已經是正序了,我還要你冒泡排序有何用啊)。

4、什么時候最慢

當輸入的數據是反序時(寫一個 for 循環反序輸出數據不就行了,干嘛要用你冒泡排序呢,我是閑的嗎)。

5、Java 代碼實現

2、選擇排序

選擇排序是一種簡單直觀的排序算法,無論什么數據進去都是 O(n2) 的時間復雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不占用額外的內存空間了吧。

1、算法步驟

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  • 再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。
  • 重復第二步,直到所有元素均排序完畢。

3、Java 代碼實現

3、插入排序

插入排序的代碼實現雖然沒有冒泡排序和選擇排序那么簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序算法,它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。

插入排序和冒泡排序一樣,也有一種優化算法,叫做拆半插入。

1、算法步驟

  • 將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最后一個元素當成是未排序序列。
  • 從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的后面。)

2. 動圖演示

1eea7a5a4c8e2baca0c64469ee9b18a7.gif

3、Java 代碼實現

4、希爾排序

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。

希爾排序是基于插入排序的以下兩點性質而提出改進方法的:

  • 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率;
  • 但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位;

希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。

1、算法步驟

  • 選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
  • 按增量序列個數 k,對序列進行 k 趟排序;
  • 每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

2、Java 代碼實現

5、歸并排序

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。

作為一種典型的分而治之思想的算法應用,歸并排序的實現由兩種方法:

  • 自上而下的遞歸(所有遞歸的方法都可以用迭代重寫,所以就有了第 2 種方法);
  • 自下而上的迭代;

在《數據結構與算法 JavaScript 描述》中,作者給出了自下而上的迭代方法。但是對于遞歸法,作者卻認為:

However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.

然而,在 JavaScript 中這種方式不太可行,因為這個算法的遞歸深度對它來講太深了。

說實話,我不太理解這句話。意思是 JavaScript 編譯器內存太小,遞歸太深容易造成內存溢出嗎?還望有大神能夠指教。

和選擇排序一樣,歸并排序的性能不受輸入數據的影響,但表現比選擇排序好的多,因為始終都是 O(nlogn) 的時間復雜度。代價是需要額外的內存空間。

1、算法步驟

  • 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列;
  • 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置;
  • 比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置;
  • 重復步驟 3 直到某一指針達到序列尾;
  • 將另一序列剩下的所有元素直接復制到合并序列尾。

3、Java 代碼實現

6、快速排序

快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。

快速排序又是一種分而治之思想在排序算法上的典型應用。本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。

快速排序的名字起的是簡單粗暴,因為一聽到這個名字你就知道它存在的意義,就是快,而且效率高!它是處理大數據最快的排序算法之一了。雖然 Worst Case 的時間復雜度達到了 O(n2),但是人家就是優秀,在大多數情況下都比平均時間復雜度為 O(n logn) 的排序算法表現要更好,可是這是為什么呢,我也不知道。好在我的強迫癥又犯了,查了 N 多資料終于在《算法藝術與信息學競賽》上找到了滿意的答案:

快速排序的最壞運行情況是 O(n2),比如說順序數列的快排。但它的平攤期望時間是 O(nlogn),且 O(nlogn) 記號中隱含的常數因子很小,比復雜度穩定等于 O(nlogn) 的歸并排序要小很多。所以,對絕大多數順序性較弱的隨機數列而言,快速排序總是優于歸并排序。

1、算法步驟

  • 從數列中挑出一個元素,稱為 “基準”(pivot);
  • 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;
  • 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序;

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

3、Java 代碼實現

7、堆排序

堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

  • 大頂堆:每個節點的值都大于或等于其子節點的值,在堆排序算法中用于升序排列;
  • 小頂堆:每個節點的值都小于或等于其子節點的值,在堆排序算法中用于降序排列;

堆排序的平均時間復雜度為 Ο(nlogn)。

1、算法步驟

  • 創建一個堆 H[0……n-1];
  • 把堆首(最大值)和堆尾互換;
  • 把堆的尺寸縮小 1,并調用 shift_down(0),目的是把新的數組頂端數據調整到相應位置;
  • 重復步驟 2,直到堆的尺寸為 1。

2、動圖演示

3、Java 代碼實現

8、計數排序

計數排序的核心在于將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。

2、Java 代碼實現

9、桶排序

桶排序是計數排序的升級版。它利用了函數的映射關系,高效與否的關鍵就在于這個映射函數的確定。為了使桶排序更加高效,我們需要做到這兩點:

  1. 在額外空間充足的情況下,盡量增大桶的數量
  2. 使用的映射函數能夠將輸入的 N 個數據均勻的分配到 K 個桶中

同時,對于桶中元素的排序,選擇何種比較排序算法對于性能的影響至關重要。

1、什么時候最快

當輸入的數據可以均勻的分配到每一個桶中。

2、什么時候最慢

當輸入的數據被分配到了同一個桶中。

3、Java 代碼實現

10、基數排序

基數排序是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。由于整數也可以表達字符串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用于整數。

1)基數排序 vs 計數排序 vs 桶排序

基數排序有兩種方法:

這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異:

  • 基數排序:根據鍵值的每位數字來分配桶;
  • 計數排序:每個桶只存儲單一鍵值;
  • 桶排序:每個桶存儲一定范圍的數值;

2)LSD 基數排序動圖演示

3、Java 代碼實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何恢復osd的auth表中的權限

2019獨角獸企業重金招聘Python工程師標準>>> 原因:當你一不小心刪掉了osd的auth信息時,重啟osd服務,此時ceph -s查看發現osd down 如: [rootceph ~]# ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIM…

nginx服務器配置安全維護,Nginx服務器相關的一些安全配置建議

這篇文章主要介紹了Nginx服務器相關的一些安全配置建議,共計總結了十個小點,需要的朋友可以參考下Nginx是當今最流行的Web服務器之一。它為世界上7%的web流量提供服務而且正在以驚人的速度增長。它是個讓人驚奇的服務器,我愿意部署它。下面是一個常見安全陷阱和解決…

帶有示例的Python date strftime()方法

Python date.strftime()方法 (Python date.strftime() Method) date.strftime() method is used to manipulate objects of date class of module datetime. date.strftime()方法用于操作模塊datetime的日期類的對象。 It takes an instance of the class and returns a stri…

python 發送郵件connect none_使用python向IP地址發送郵件

所以我嘗試通過python腳本發送郵件。使用通常的接收者地址格式可以正常工作”userdomain.tld". 當我現在嘗試使用帶有接收者“user[IP Address]的腳本時,我所有的調試輸出看起來都很好,sendmail方法也可以工作,但是郵件始終沒有收到。我…

老男孩IT教育38期面授班 學員邢偉的決心書

大家好我叫邢偉,今年22歲,上一份工作是做媒體推廣的,拿完獎金飯補全勤獎月薪大概4K左右,在北京生活感覺力不從心現在參加老男孩IT教育linux運維38期,在接下來的學習中,我的目標是畢業后達到月薪12K在接下來的學習中早上…

PS打開PSD文檔服務器未響應,ps打不開psd文件的解決方法

很多人用ps做作品的時候,經常遇到psd文件打不開的問題,最常見的有三種原因,有兩種可以設置解決,另一種是文件損壞,不可恢復。下面是學習小編給大家整理的有關介紹ps打不開psd文件的解決方法,希望對大家有幫…

strictmath_Java StrictMath cbrt()方法與示例

strictmathStrictMath類cbrt()方法 (StrictMath Class cbrt() method) cbrt() method is available in java.lang package. cbrt()方法在java.lang包中可用。 cbrt() method is used to find the cube root of the given parameter in the method. Here, cbrt stands for cube …

模塊---常用模塊

import osprint(os.getcwd()) #得到當前目錄#os.chmod("/usr/local",7) #給文件或者文件夾加權限,7為最高權限print(os.chdir("../")) #更改當前目錄print(os.curdir) #當前目錄print(os.pardir) #父目錄print(os.mkdir("test1")) #創…

excel添加列下拉框票價_excel表格下拉表格添加數據-excel2017表格中怎么制作下拉菜單列表框...

在Excel表中,如何將增加下拉菜單的選項?excel中的下拉菜單選項,就是篩選的功能,具體操作如下:1.首先選中a、b兩列數據,在“開始”選項卡上選擇“篩選”;2.這樣就在excel表中添加了下拉菜單選項。…

ajax實現兩個aspx跳轉,請問ajax執行成功后可以跳轉到另一個頁面嗎?

一只名叫tom的貓通過ajax讀取到寫好的jsp,另一個jsp可以放framse或者層都可以,顯示就行了123456789$.ajax({ type: "POST", //用post方式傳輸 dataType: "html", //數據格式:json…

Android橫豎屏切換View設置不同尺寸或等比例縮放的自定義View的onMeasure解決方案(2)...

Android橫豎屏切換View設置不同尺寸或等比例縮放的自定義View的onMeasure解決方案(2)附錄文章1以xml布局文件方式實現了一個view在橫豎屏切換時候的大小尺寸縮放,實現這種需求,也可以使用自定義View的onMeasure方法實現。比如&…

java中的push方法_Java ArrayDeque push()方法與示例

java中的push方法ArrayDeque類push()方法 (ArrayDeque Class push() method) push() Method is available in java.lang package. push()方法在java.lang包中可用。 push() Method is used to push an element onto the stack denoted by this deque. push()方法用于將元素壓入…

7段均衡器最佳參數_十段均衡器的設置和參數

本帖最后由 GTXarrow 于 2015-2-2 14:53 編輯EQ的基本定義:EQ是Equalizer的縮寫,大陸稱為均衡器,港臺稱為等化器。作用是調整各頻段信號的增益值。10段均衡器表示有10個可調節節點。節點越多,便可以調節出更精確的曲線,同時難度更…

本地 服務器 文件傳輸,本地服務器文件傳輸

本地服務器文件傳輸 內容精選換一換CDM支持周期性自動將新增文件上傳到OBS,不需要寫代碼,也不需要用戶頻繁手動上傳即可使用OBS的海量存儲能力進行文件備份。這里以CDM周期性備份FTP的文件到OBS為例進行介紹。例如:FTP服務器的to_obs_test目錄…

上市公司行情查詢站點

http://stock.finance.sina.com.cn/usstock/quotes/BABA.html

java peek方法_Java ArrayDeque peek()方法與示例

java peek方法ArrayDeque類peek()方法 (ArrayDeque Class peek() method) peek() Method is available in java.lang package. peek()方法在java.lang包中可用。 peek() Method is used to return the head element of the queue denoted by this deque but without removing t…

中怎么撤回消息_微信消息撤回也能看到,這個開源神器牛x!語音、圖片、文字都支持!...

1.前言 微信在2014年的時候,發布的v5.3.1 版本中推出了消息撤回功能,用戶可以選擇撤回 2 分鐘內發送的最后一條信息。現在很多即時通訊的軟件都有撤回這個功能。騰訊為了照顧手殘黨,在微信和QQ中都加入了【消息撤回】的功能。但是這個功能對于…

ntce服務器不穩定,當心!你的教師資格證成績失效了!| 服務

原標題:當心!你的教師資格證成績失效了!| 服務湖南的小王同學資格證筆試考了兩次才全部通過,想著好好歇歇,結果就誤了面試報名,等到第三年面試報名時才發現有一科筆試成績已經過期了......天吶,…

java中get接口示例_Java即時類| 帶示例的get()方法

java中get接口示例即時類的get()方法 (Instant Class get() method) get() method is available in java.time package. get()方法在java.time包中可用。 get() method is used to get the value of the given field from this Instant object. get()方法用于從此Instant對象獲…

深度學習與計算機視覺系列(6)_神經網絡結構與神經元激勵函數

作者:寒小陽 && 龍心塵 時間:2016年1月。 出處: http://blog.csdn.net/han_xiaoyang/article/details/50447834 http://blog.csdn.net/longxinchen_ml/article/details/50448267 聲明:版權全部。轉載請聯系作者并注明出…