Python - 排序( 插入, 冒泡, 快速, 二分 )

插入排序

算法分析

兩次循環, 大循環對隊列中的每一個元素拿出來作為小循環的裁定對象

小循環對堆當前循環對象在有序隊列中尋找插入的位置

性能參數

空間復雜度  O(1)

時間復雜度  O(n^2)

詳細代碼解讀

import randomdef func(l):# 外層循環: 對應遍歷所有的無序數據for i in range(1, len(l)):# 備份 取出數據temp = l[i]# 記錄取出來的下標值pos = i# 內層循環: 對應從后往前掃描所有有序數據"""i - 1  >   從最后一個有序數據開始, 即無序數據前一位-1  >   掃描到下標 0 為止, 要包括第一個, 因此設置 -1 往后推一位-1  >   從后往前掃描"""for j in range(i - 1, -1, -1):# 若有序數據 大于 取出數據if l[j] > temp:# 有序數據后移l[j + 1] = l[j]# 更新數據的插入位置pos = j  # 對應所有有序數據比取出數據大的情況# 若有序數據 小于/等于  取出數據else:pos = j + 1break# 在指定位置插入數據l[pos] = tempif __name__ == '__main__':l = list(range(1, 13))random.shuffle(l)func(l)print(l)

簡單實例

import randomdef foo(l):for i in range(1, len(l)):temp = l[i]pos = ifor j in range(i - 1, -1, -1):if temp < l[j]:l[j + 1] = l[j]pos = jelse:pos = j + 1breakl[pos] = tempreturn lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [12, 0, 4, 5, 6, 2, 11, 10, 8, 7, 3, 1, 9]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

冒泡排序

算法分析

兩兩比較, 每次比較出一個未排序隊列的最大值,讓只在隊列右側排列

兩次循環, 大循環每次輸出一個當前最大值.?

小循環進行具體的數值比對

性能參數

空間復雜度  O(1)

時間復雜度  O(n^2)

詳細代碼

"""
入學后, 第一次上體育課, 體育老師要求大家排隊, 按照身高從低到高排隊
獲取全班 10 名同學的身高
""""""
外層循環大循環控制總循環次數                    
內層循環小循環控制如歌得出這個最大值計算大小, 然后彼此交換
"""import random"""
基礎版
"""def func(l):# 外層循環: 走訪數據的次數for i in range(len(l) - 1):# 內層循環: 每次走訪數據時, 相鄰對比次數for j in range(len(l) - i - 1):# 要求從低到高# 如次序有誤就交換if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]# 遍歷次數print("走訪次數:", i + 1)"""
升級版
"""def foo(l):# 外層循環: 走訪數據的次數for i in range(len(l) - 1):# 設置是否交換標志位flag = False# 內層循環: 每次走訪數據時, 相鄰對比次數for j in range(len(l) - i - 1):# 要求從低到高# 如次序有誤就交換if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]# 發生了數據交換flag = True# 如果未發生交換數據, 則說明后續數據均有序if flag == False:break  # 跳出數據走訪# 遍歷次數print("走訪次數:", i + 1)if __name__ == '__main__':l = list(range(1, 11))random.shuffle(l)print("排序前:", l)# func(l)
    foo(l)print("排序后:", l)

簡單代碼

import randomdef foo(l):for i in range(len(l) - 1):for j in range(len(l) - i - 1):if l[j] > l[j + 1] and j != len(l):l[j], l[j + 1] = l[j + 1], l[j]return lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [2, 3, 0, 7, 8, 11, 10, 6, 4, 5, 12, 1, 9]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

升級版代碼

import randomdef foo(l):for i in range(len(l) - 1):flag = 1for j in range(len(l) - i - 1):if l[j] > l[j + 1] and j != len(l):l[j], l[j + 1] = l[j + 1], l[j]flag = 0if flag:breakreturn lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [0, 9, 1, 3, 8, 12, 6, 5, 2, 7, 10, 11, 4]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

快速排序

算法分析

首先任意取一個元素作為關鍵數據 ( 通常取首元素

然后將所有比他小的數據源放在其前面,?所有比它大的放在他后面

通過一次排序將要排序的數據分為獨立的兩部分

然后按照該方法再遞歸對兩部分數據進行快速排序

性能參數

時間復雜度  O(nlogn)

空間復雜度  O(logn)

穩定性    不穩定

詳細代碼

# 快速排序
import randomdef quick(l):# 遞歸退出條件# 僅剩一個元素無需繼續分組if len(l) < 2:return l# 設置關鍵數據a = l[0]# 找出所有比 a 大的數據big = [x for x in l if x > a]# 找出所有比 a 小的數據small = [x for x in l if x < a]# 找出所有與 a 相等的數據same = [x for x in l if x == a]# 拼接數據排序的結果return quick(small) + same + quick(big)if __name__ == '__main__':l = list(range(1, 25))random.shuffle(l)l = quick(l)print(l)

二分查找

算法分析

只能對有序隊列進行查找, 利用和中間值進行對比, 然后基于判斷將隊列丟棄一半的方式

性能參數

時間復雜度  O(log2 n)
空間復雜度  O(1)

詳細代碼

"""
1. 切分成兩部分,取中間值來判斷
2. 如何定義下一次的范圍:大于中間值, 在左側找小于中間值, 在右側找
3. 查找失敗情況: 中間值 小于左端 或者 中間值 大于 右端
""""""
撲克牌 只取 黑桃 13 張, 用 1-13 表示, 將牌從小到大排序, 反面向上排成一排, 找到黑桃 6 的位置
""""""
l   原始數據
k     待查找數據
left    首元素下標值
right   尾元素下標值
""""""
遞歸方式實現
"""def func(l, k, left, right):# 遞歸退出條件if left > right:# 查找結束return -1# 獲取中間元素對應下標值middle = (left + right) // 2# 對比中間元素 和 查找元素if l[middle] == k:return middleelif l[middle] > k:# 中間值 大于 查找值# 查找范圍是 中分后的 左邊部分# 左側下標值不變, 右側下標值變為 middle 前一位right = middle - 1return func(l, k, left, right)else:# 中間值 小于 查找值# 查找范圍是 中分后的 右邊部分# 左側下標值變為 middle 后一位, 右側下標值不變left = middle + 1return func(l, k, left, right)"""
循環方式實現
"""def foo(l, k):left = 0right = len(l) - 1while left <= right:mid = (left + right) // 2if l[mid] > k:right = mid - 1elif l[mid] < k:left = mid + 1elif l[mid] == k:return midreturn -1if __name__ == '__main__':# l = list(range(1, 14))# k = 8# right = len(l) - 1# res = func(l, k, 0, right)
l = list(range(1, 14))k = 10right = len(l) - 1res = foo(l, k)if res == -1:print("查找失敗")else:print("查找成功, 第 %d 張拿到" % res)

簡單代碼

def foo(l, k):left = 0right = len(l) - 1while left <= right:mid = (left + right) // 2if l[mid] > k:right = mid - 1elif l[mid] < k:left = mid + 1elif l[mid] == k:return midreturn -1if __name__ == '__main__':l = list(range(13))print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]print(foo(l, 8))  # 8

總結

冒泡排序

重復走訪所有要排序的數據,
依次比較每兩個相鄰的元素,
如果兩者次序錯誤就交換
重復上面過程 直到沒有需要被調換的內容為止

插入排序

將數據插入到已經有序的數據中, 從而得到一個新的有序數據

默認首元素自然有序, 取出下一個元素, 對已經有序的數據從后向前掃描

若掃描的有序數據大于取出數據, 則該有序數據后移

若掃描的有序數據小于取出數據, 則在該有序數據后插入取出數據

若掃描的所有的有序數據大于取出數據, 則在有序數據的首位插入取出數據

特點

數據只移動不交換, 優于冒泡

快速排序

首先任意取一個元素作為關鍵數據 ( 通常取首元素 )

然后將所有比他小的數據源放在其前面

(從小到大)所有比它大的放在他后面

通過一次排序將要排序的數據分為獨立的兩部分

然后按照該方法再遞歸對兩部分數據進行快速排序

特點

每次若能均勻分組則排序速度最快, 但是不穩定

?

轉載于:https://www.cnblogs.com/shijieli/p/10922566.html

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

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

相關文章

[EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)

2014-02-0610325 0C# 檢舉文章 過年結束了&#xff0c;雖然還是學生所以其實還有兩個禮拜的假期&#xff0c;不過為了不讓自己發慌&#xff0c;趁著假期多利用充實自己&#xff0c;所以提早回到開工狀態&#xff0c;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

G.點我

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/903/G 題意&#xff1a; X腿與隊友到河北省來參加2019河北省大學生程序設計競賽&#xff0c;然而這場比賽的題目難度實在是太高了。比賽開始一個小時后&#xff0c;X腿仍然沒有做出一個題。這時候&#xff0c;X腿驚訝的發…

輪廓的查找、表達、繪制、特性及匹配(How to Use Contour? Find, Component, Construct, Features Match)

前言 輪廓是構成任何一個形狀的邊界或外形線。前面講了如何根據色彩及色彩的分布&#xff08;直方圖對比和模板匹配&#xff09;來進行匹配&#xff0c;現在我們來看看如何利用物體的輪廓。包括以下內容&#xff1a;輪廓的查找、表達方式、組織方式、繪制、特性、匹配。 查…

Android:IntentService的學習

在Android的四大組件中&#xff0c;Service排行老二&#xff0c;在Android中的主要作用是后臺服務&#xff0c;進行與界面無關的操作。由于Service運行在主線程&#xff0c;所以進行異步操作需要在子線進行。為此Android為我們提供了IntentService。 IntentService是一個抽象類…

智能商業大會構造信息化交流平臺

在快速發展的當今社會&#xff0c;所有事物都在日新月異地變化著&#xff0c;相較于過去的傳統商業的變化速度&#xff0c;現今基于數據的互聯網商業變化速度高出了一個量級&#xff0c;同時市場對于企業的應對速度也有了更高的要求&#xff0c;然而面對大體量的數據&#xff0…

itcast-ssh-crm實踐

分析 BaseDao 文件上傳 轉載于:https://www.cnblogs.com/hellowq/p/10209761.html

分類器大牛們

David Lowe&#xff1a;Sift算法的發明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源碼OpenSift的作者&#xff0c;個人主頁上有openSift的下載鏈接&#xff0c;Opencv中sift的實現&#xff0c;也是參考這個。 Koen van de Sande&#xff1a;作者給出了sift,densesift,co…

go 成長路上的坑(1)

一、先來看一段代碼 package mainimport "fmt"type X struct{}func (x *X) test(){println("h1",x) } func main(){a : X{} a.test()(&X{}).test()(X{}).test() } 猜猜他的結果 二、揭曉答案 package mainimport "fmt"type X struct{}func (…

利用python腳本程序監控文件被修改

需求&#xff1a;利用python編寫監控程序&#xff0c;監控一個文件目錄&#xff0c;當目錄下的文件發生改變時&#xff0c;實現有修改就發報警郵件 郵件使用QQ郵箱&#xff0c;需要開啟smtp&#xff0c;使用手機發生短信&#xff0c;騰訊會給你發郵箱密碼。如下所示&#xff1a…

Oracle RAC

環境如下&#xff1a; Linux操作系統&#xff1a;Centos 6.5 64bit &#xff08;這個版本的redhat 6內核等OS在安裝grid最后執行root.sh時會出現crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

好程序員web前端分享MVVM框架Vue實現原理

好程序員web前端分享MVVM框架Vue實現原理&#xff0c;Vue.js是當下很火的一個JavaScript MVVM庫&#xff0c;它是以數據驅動和組件化的思想構建的。相比于Angular.js和react.js更加簡潔、更易于理解的API&#xff0c;使得我們能夠快速地上手并使用Vue.js。?1.什么是MVVM呢&…

HDU - 3516 Tree Construction

HDU - 3516 思路&#xff1a; 平行四邊形不等式優化dp &#xff1a;&#xff09; 代碼&#xff1a; #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc.h> using namespace std; #define y1 y11 #define fi first #define se…

各類總線傳輸速率

1. USB總線 USB1.1&#xff1a; -------低速模式(low speed)&#xff1a;1.5Mbps -------全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 -------高速模式(high speed)&#xff1a; 25~480Mbps US…

Activiti多人會簽例子

Activiti中提供了多實例任務&#xff08;for-each&#xff09;將多實例應到到UserTask中可以實現會簽功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

Django 【認證系統】auth

本篇內容 介紹Django框架提供的auth 認證系統 方法&#xff1a; 方法名 備注 create_user 創建用戶 authenticate 登錄驗證 login 記錄登錄狀態 logout 退出用戶登錄 is_authenticated 判斷用戶是否登錄 login_required裝飾器 進行登錄判斷 引入模塊 from django.…

兒科常見疾病的中成藥療法

孩子感冒&#xff0c;分清寒熱是關鍵——兒童風寒感冒和風熱感冒的中成藥內服外治法 兒童不養兒不知父母恩&#xff0c;每個人恐怕都只有自己做了父母&#xff0c;才能感受到父母的愛。嬰幼兒正處于最初的發育期&#xff0c;抵抗力弱&#xff0c;有個感冒發燒的也是常有的事兒。…

物化視圖

有個項目因為有比較多的查詢匯總&#xff0c;考慮到速度&#xff0c;所以使用了物化視圖。簡單的把用到的給整理了下。先看簡單創建語句&#xff1a;create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char( s…

為什么直接ping知乎的ip不能訪問知乎的網站,而百度就可以?

結論&#xff1a; 簡單的說&#xff0c;就是baidu有錢。 正文&#xff1a; 大型網站依靠自身稀稀落落的服務器很難滿足網頁“秒開”的用戶需求&#xff0c;會加入CDN加速的隊伍。 當用戶訪問 http://www.zhihu.com 時&#xff0c;域名解析到距離用戶最近的CDN服務器的公網IP&am…

皮膚病

小偏方治百病/《國醫絕學健康館》編委會編.—重慶&#xff1a;重慶出版社&#xff0c;2010.3&#xff08;國醫絕學健康館&#xff09; 濕疹 苦參湯熏洗治陰囊濕疹方 苦參、蛇麻子中藥各50克&#xff0c;混合后&#xff0c;在晚上煎湯&#xff0c;可直接放在臉盆中煎。煎好后&am…

MySQL-ProxySQL中間件(一)| ProxySQL基本概念

目錄 MySQL-ProxySQL中間件&#xff08;一&#xff09;| ProxySQL基本概念&#xff1a; https://www.cnblogs.com/SQLServer2012/p/10972593.htmlMySQL-ProxySQL中間件&#xff08;二&#xff09;| Admin Schemas介紹&#xff1a;https://www.cnblogs.com/SQLServer2012/p/109…