程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 算法之排序算法的算法思惟和應用場景總結

算法之排序算法的算法思惟和應用場景總結

編輯:關於C++

算法之排序算法的算法思惟和應用場景總結。本站提示廣大學習愛好者:(算法之排序算法的算法思惟和應用場景總結)文章只能為提供參考,不一定能成為您想要的結果。以下是算法之排序算法的算法思惟和應用場景總結正文


1. 概述

排序算法是盤算機技巧中最根本的算法,很多龐雜算法都邑用到排序。雖然各類排序算法都已被封裝成庫函數供法式員應用,但懂得排序算法的思惟和道理,關於編寫高質量的軟件,顯得異常主要。

本文引見了罕見的排序算法,從算法思惟,龐雜度和應用場景等方面做了總結。

2. 幾個概念

(1)排序穩固:假如兩個數雷同,對他們停止的排序成果為他們的絕對次序不變。例如A={1,2,1,2,1}這裡排序以後是A = {1,1,1,2,2} 穩固就是排序後第一個1就是排序前的第一個1,第二個1就是排序前第二個1,第三個1就是排序前的第三個1。同理2也是一樣。不穩固就是他們的次序與開端次序紛歧致。

(2)原地排序:指不請求過剩的空間停止的排序,就是在本來的排序數據中比擬和交流的排序。例如疾速排序,堆排序等都是原地排序,歸並排序,計數排序等不是原地排序。

整體上說,排序算法有兩種設計思緒,一種是基於比擬,另外一種不是基於比擬。《算法導論》一書給出了如許一個證實:“基於比擬的算法的最優時光龐雜度是O(N lg N)”。關於基於比擬的算法,有三種設計思緒,分離為:拔出排序,交流排序和選擇排序。非基於比擬的排序算法時光龐雜度為O(lg N),之所以龐雜度如斯低,是由於它們普通對排序數據有特別請求。如計數排序請求數據規模不會太年夜,基數排序請求數據可以分化成多個屬性等。

3. 基於比擬的排序算法

正如前一節引見的,基於比擬的排序算法有三種設計思緒,分離為拔出,交流和選擇。關於拔出排序,重要有直接拔出排序,希爾排序;關於交流排序,重要有冒泡排序,疾速排序;關於選擇排序,重要有簡略選擇排序,堆排序;其它排序:合並排序。

3.1  拔出排序

(1) 直接拔出排序
特色:穩固排序,原地排序,時光龐雜度O(N*N)
思惟:將一切待排序數據分紅兩個序列,一個是有序序列S,另外一個是待排序序列U,初始時,S為空,U為一切數據構成的數列,然後順次將U中的數據插到有序序列S中,直到U變成空。

實用場景:當數據曾經根本有序時,采取拔出排序可以顯著削減數據交流和數據挪動次數,進而晉升排序效力。

(2)希爾排序

特色:非穩固排序,原地排序,時光龐雜度O(n^lamda)(1 < lamda < 2), lamda和每次步長選擇有關。

思惟:增量減少排序。先將序列按增量劃分為元素個數近似的若干組,應用直接拔出排序法對每組停止排序,然後赓續減少增量直至為1,最初應用直接拔出排序完成排序。

實用場景:由於增量初始值不輕易選擇,所以該算法不經常使用。

3.2  交流排序

(1)冒泡排序

特色:穩固排序,原地排序,時光龐雜度O(N*N)
思惟:將全部序列分為無序和有序兩個子序列,赓續經由過程交流較年夜元素至無序子序列首完成排序。

實用場景:同直接拔出排序相似

(2)疾速排序

特色:不穩固排序,原地排序,時光龐雜度O(N*lg N)
思惟:赓續尋覓一個序列的樞軸點,然後分離把小於和年夜於樞軸點的數據移到樞軸點雙方,然後在雙方數列中持續如許的操作,直至全體序列排序完成。

實用場景:運用很普遍,差不多各類說話均供給了快排API

3.3  選擇排序

(1)簡略選擇排序

特色:不穩固排序(好比對3 3 2三個數停止排序,第一個3會與2交流),原地排序,時光龐雜度O(N*N)

思惟:將序列劃分為無序和有序兩個子序列,尋覓無序序列中的最小(年夜)值和無序序列的首元故舊換,有序區擴展一個,輪回下去,終究完玉成部排序。

實用場景:交流少

(2) 堆排序

特色:非穩固排序,原地排序,時光龐雜度O(N*lg N)
思惟:小頂堆或許年夜頂堆
實用場景:不如快排普遍

3.4  其它排序

(1) 合並排序

特色:穩固排序,非原地排序,時光龐雜度O(N*N)
思惟:起首,將全部序列(共N個元素)算作N個有序子序列,然後順次歸並相鄰的兩個子序列,如許一向下去,直至釀成一個全體有序的序列。
實用場景:內部排序

4. 非基於比擬的排序算法

非基於比擬的排序算法重要有三種,分離為:基數排序,桶排序和計數排序。這些算法均是針對特別數據的,不如請求數據散布平均,數據誤差不會太年夜。采取的思惟均是內存換時光,因此滿是非原地排序。

4.1 基數排序

特色:穩固排序,非原地排序,時光龐雜度O(N)

思惟:把每一個數據算作d個屬性構成,順次依照d個屬性對數據排序(每輪排序可采取計數排序),龐雜度為O(d*N)

實用場景:數據顯著有幾個症結字或許幾個屬性構成

4.2  桶排序

特色:穩固排序,非原地排序,時光龐雜度O(N)

思惟:將數據按年夜小分到若干個桶(好比鏈表)外面,每一個桶外部采取簡略排序算法停止排序。

實用場景:0

4.3  計數排序

特色:穩固排序,非原地排序,時光龐雜度O(N)

思惟:對每一個數據湧現次數停止技巧(用hash辦法計數,最簡略的hash是數組!),然後從年夜到小或許從小到年夜輸入每一個數據。

應用場景:比基數排序和桶排序普遍很多。

5.  總結

關於基於比擬的排序算法,年夜部門簡略排序(直接拔出排序,選擇排序和冒泡排序)都是穩固排序,選擇排序除外;年夜部門高等排序(除簡略排序之外的)都是不穩固排序,合並排序除外,但合並排序須要額定的存儲空間。關於非基於比擬的排序算法,它們都對數據紀律有特別請求 ,且采取了內存換時光的思惟。排序算法如斯之多,常常須要依據現實運用選擇最合適的排序算法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved