數據結構——各排序算法的比較

1.從時間復雜度比較?
  從平均時間復雜度來考慮,直接插入排序、冒泡排序、直接選擇排序是三種簡單的排序方法,時間復雜度都為O(n2),而快速排序、堆排序、二路歸并排序的時間復雜度都為O(nlog2n),希爾排序的復雜度介于這兩者之間。若從最好的時間復雜度考慮,則直接插入排序和冒泡排序的時間復雜度最好,為O(n),其它的最好情形同平均情形相同。若從最壞的時間復雜度考慮,則快速排序的為O(n2),直接插入排序、冒泡排序、希爾排序同平均情形相同,但系數大約增加一倍,所以運行速度將降低一半,最壞情形對直接選擇排序、堆排序和歸并排序影響不大.
2.從空間復雜度比較?
  歸并排序的空間復雜度最大,為O(n),快速排序的空間復雜度為O(log2n),其它排序的空間復雜度為O(1)。?
3.從穩定性比較?
  直接插入排序、冒泡排序、歸并排序是穩定的排序方法,而直接選擇排序、希爾排序、快速排序、堆排序是不穩定的排序方法。?
4.從算法簡單性比較?
  直接插入排序、冒泡排序、直接選擇排序都是簡單的排序方法,算法簡單,易于理解,而希爾排序、快速排序、堆排序、歸并排序都是改進型的排序方法,算法比簡單排序要復雜得多,也難于理解。

  迄今為止,已有的排序方法遠遠不止本章討論的這些方法,人們之所以熱衷于研究多種排序方法,不僅是由于排序在計算機中所處的重要地位,而且還因為不同的方法各有其優缺點,可適用于不同的場合。選取排序方法時需要考慮的因素有
待排序的記錄數目n;記錄本身信息量的大小;關鍵字的結構及分布情況;對排序穩定性的要求;語言工具的條件,輔助表的大小等。依據這些因素,可得出如下幾點結論:
(1)若n較小(譬如n50),可采用直接插入排序或直接選。由于直接插入排序所需記錄移動操作較直接選擇排序多,因此若記錄本身信息量較大時,則選用直接選擇排序為宜。?
(2)若文件的初始狀態已是按關鍵字基本有序,則選用直接插入排序泡排序為宜。?
(3)若N較大,則應根據其時間復雜度來選擇排序方法:快速排序\堆排序或歸并排序,快速排序是目前基于內部排序的中被認為是最好的方法,檔待排序的關鍵字是隨機時,快速排序的平均時間最少,但堆排序所需的輔助空間少于快速排序,并且不會出現序可能出現的最壞情況,這兩種排序方法都是不穩定的,若要求排序穩定則可選用歸并排序。但本文章結合介紹的兩兩歸并排算法并不值得提倡,通常可以將它和直接排序結合在一起用。先利用直接插入排序求得的子文件,然后再兩兩歸并之。因為直接插入排序是穩定的,所以,改進后的歸并排序是穩定的。
(4)前面討論的排序算法,除排序外,都是在一維數組上實現的,當記錄本身信息量較大時,為了避免浪費大量時間移動記錄,可以用鏈表作為存儲結構,如插入排序和歸并排序都易于在鏈表上實現,并分別稱之為表和歸并表,但有的方法,如快速排序和堆排序,在鏈表上難于實現,在這種情況下,可以提取關鍵字建立索引表,然后,對索引表進行排序。然而更為簡單的方法是;引入一個整形向量作為輔助表,排序前,若排序算法中要求交換,則只需交換R[I]和R[j]即可,排序結束后,向量就指示了記錄之間的順序關系.

轉載于:https://www.cnblogs.com/sheropan/p/5022437.html

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

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

相關文章

將c程序移植到linux,各位大俠:我把原來在linux運行的c程序移植到HPUNIX上出現了錯誤...

各位大俠:我把原來在linux運行的c程序移植到HPUNIX上出現了錯誤(2012-04-11 00:43:47)標簽:linuxc程序雜談各位大俠:我把原來在linux運行的c程序移植到HP_UNIX上出現了錯誤makefileCC aCC -AA W829 DD64 DAportable-I/ods/app/oracle/produc…

數據庫學習建議之提高數據庫速度的十條建議

很多網站的重要信息都是保存在數據庫中的,用戶通過提交訪問數據庫來獲取用戶信息。如果數據庫速度非常的快,有助于節省服務器的資源,在這篇文章中,我收集了十個優化數據庫速度的技巧。0. 小心設計數據庫第一個技巧也許看來理所當然…

Java中數據類型的取值范圍

整數數據類型的取值范圍 我們都知道計算機的底層是二進制,也知道不同的整數類型存儲值的范圍不同,可這些數值在計算機底層是怎樣存儲的呢?數值范圍又是怎么計算出來的呢? 下面以java來進行舉例: byte 1個字節 (8bit…

linux的cpu信息怎么理解,理解Linux下的CPU信息:lscpu cpuinfo

通過lscpu命令,可以看到CPU的一些基本信息。如下所示,可以很清楚的看到這臺服務器使用兩個物理socket,每個socket上有6個core,每個core上有兩個線程(超線程),所以一共有2 * 6 * 2 24個邏輯CPU。Architecture: x86_64C…

如何降低SQL語句復雜度

SQL語句復雜度的優化就是在結果正確的前提下,將復雜、難以維護的SQL語句拆分成獨立、易懂的SQL片段,當然也要充份利用索引,減少表描的I/O次數,盡量避免表搜索的發生。下面介紹降低SQL語句復雜度的幾個建議1、動態查詢語句一些應用…

提高程序員工作效率的11個技巧

“吃苦耐勞”真的是優良品質嗎,與你怎么做相比,老板們應該更關心你做了什么、達到的效果。所以,效率,還是效率,希望這些實用小技巧對大家有所幫助。1、兩分鐘法則如果一件事可以在兩分鐘內完成,比如回復郵件…

tq3358 linux 串口驅動編程,TQ335x——spidev驅動的生成

kernel:CD盤的kernel3.2包環境:vmware10,ubuntu14.04修改的部分:arch/arm/mach-omap2/board-am335xevm.c文件中static struct spi_board_info am335x_spi1_slave_info[] {{.modalias "smb380",.platform_data &A…

Linux下顯示ip所屬位置

在linux下,要是網絡出現延遲,通常我們需要分析自己到對端的服務器的網絡環境 1 例:ping www.baidu.com 2 traceroute www.baidu.com 通過分析來確定大概是什么問題,可當我們去跟蹤某個ip的時候不知道來源,假如每一個…

C#程序集相關的概念

程序集包含:類型元數據(描述在代碼中定義的每一類型和成員,二進制形式)。程集元數據(程序集清單、版本號、名稱等)、IL代碼(這些都被裝在exe或dll中)、資源文件。每個程序集都有自己…

linux+刪除亂碼的文件,linux 下刪除亂碼文件-乾頤堂

在linux下刪除文件,遇到特殊字符是一件非常頭疼的事情。1. 如果文件名帶 ‘-’ 或者‘--’這樣的字符刪除辦法為:rm -- 文件名如文件名為:-pythontab.tgz如果用普通方法去刪除:1rm -pythontab.tgz結果錯誤:rm: invalid…

程序員如何保護自己的頸椎

我們程序員天天對著電腦,眼睛,頸椎等等,都會落下不少的職業病。來說說怎么治療自己的頸椎病。1、頸椎病是怎么產生的形成頸椎病的核心原因是:不良生活習慣我們身體的絕大部分疾病都是來自不良的生活習慣,生活習慣不改&…

如何改變XCode的默認設置

改變bundle ID 進入 /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application 目錄然后進入各個子目錄(Navigation-based ApplicationOpenGL ES ApplicationSplit View-based ApplicationTab Bar ApplicationUtility ApplicationView-b…

linux關機時循環輸出腳本,Linux關機時執行指定腳本功能實現

1.關機時執行某個腳本的具體思路(1)在文件夾/etc/init.d/下創建關機時需要執行的腳本file_name;(2)分別在文件夾/etc/rc0.d/和/etc/rc6.d/下創建該該腳本文件的鏈接文件K07file_name:sudo ln -s /etc/init.d/file_name /etc/rc0.d/K07file_namesudo ln -…

URI和URL及URN的區別

對于URL,大家都比較熟悉,其他兩個詞就比較陌生了。URI、URL和URN是識別、定位和命名互聯網上的資源的標準途徑。1989年Tim Berners-Lee發明了互聯網(World Wide Web)。WWW被認為是全球互連的實際的和抽象的資源的集合–它按需求提供信息實體–…

Linux基礎-目錄與路徑

今天我們一起來認識下linux中的目錄與路徑及操作其的一些常用命令。 說起路徑就有絕對與相對之分,雖然簡單,我們還是再啰嗦一下: 絕對路徑,從系統的根目錄/開始的目錄都是相對路徑,比如/usr/bin、/usr/local 相對路徑…

螺旋圖形Linux,Canvas 螺旋線幾何圖形繪制

JavaScript語言:JaveScriptBabelCoffeeScript確定window.requestAnimFrame (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnim…

28家知名IT公司名稱的由來

28家IT公司名稱由來,你知道嗎?EMC、VMware、IBM、Oracle、NetApp、Citrix、Cisco、Google、Amazon、Alibaba、UCloud、Tencent、Baidu等著名的存儲、備份或云計算行業的IT公司,相信你我都是耳熟能詳,但這些公司的名稱是如何而來的…

編程應該用 Mac ,還是 PC ?

愛編程,不愛修電腦;愛學習,更愛運動;愛科技,也愛娛樂;愛工作,不愛加班。愛幽默、愛生活、愛浪漫、愛打拼,我是程序員,我為自己代言,關注程序員,分…

linux創建虛擬聲卡,Pear BIOS 安裝和配置指引

Pear BIOS 安裝指引Pear BIOS是一套硬件模擬系統,操作系統可以在這套模擬硬件上運行。Pear BIOS可以讓用戶同時安裝多套操作系統,使用時可以選擇任何一套操作系統啟動。在傳統電腦系統上,操作系統可以識別并必須識別硬件;而在這套…

左右值

C/C語言中可以放在賦值符號左邊的變量,即具有對應的可以由用戶訪問的存儲單元,并且能夠由用戶去改變其值的量。左值表示存儲在計算機內存的對象,而不是常量或計算的結果。或者說左值是代表一個內存地址值,并且通過這個內存地址&am…