算法的10大排序

10大排序算法--python

  • 一顆星--選擇排序
  • 一顆星--冒泡排序
  • 一顆星--插入排序
  • 兩顆星--歸并排序(遞歸-難)
  • 三顆星--桶排序
  • 三顆星--計數排序
  • 四顆星--基數排序
  • 四顆星--快速排序,尋找標志位(遞歸-難)
  • 四顆星--又是比較難的希爾排序
  • 五顆星--堆排序

誰教你這么剪的 | 11大排序的原理講解和Python源碼剖析_嗶哩嗶哩_bilibili

一顆星–選擇排序

自己看代碼都能看懂

def xuanze_paixu(bb):  
n=len(bb)  
for i in range(n-1):  
# 優化代碼  
min=i  for j in range(i+1,n):  
if bb[i]> bb[j]:  
# 優化代碼  
min=j  
bb[i], bb[min] = bb[min], bb[i]  # bb[i],bb[j]=bb[j],bb[i]  
return bb  a=[0,4,0,9,2,8,4,0,1,8]  
c=xuanzhe_paixu(a)  
print(c)

一顆星–冒泡排序

自己看代碼都能看懂

def maopao_paixu(bb):  
n=len(bb)  
# 左閉右開且遞減  
for i in range(n-1,-1,-1):  
for j in range(0,i):  
if bb[j]>bb[j+1]:  
bb[j],bb[j+1]= bb[j+1],bb[j]  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1,8,7,4,9,1,8,4,7,9]  
result=maopao_paixu(a)  
print(result)

一顆星–插入排序

def charu_paixu(bb):  
n=len(bb)  
for i in range(1,n):  
x=bb[i]  
j=i-1  
# 用j的話比較清除  
while j>=0:  
if x< bb[j]:  
bb[j+1]=bb[j]  
else:  
break  
bb[j]=x  
j = j - 1  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1]  
b=charu_paixu (a)  
print(b)

兩顆星–歸并排序(遞歸-難)

直接給我cpu干蒙了
視頻解釋
排序算法:歸并排序【圖解+代碼】_嗶哩嗶哩_bilibili
代碼如下,有兩種,多參考參考

def merge(a, start, mind, end):  
l = start  
bb = []  
right = mind + 1  while l <= mind and right <= end:  
if a[l] <= a[right]:  
bb.append(a[l])  
l += 1  
else:  
bb.append(a[right])  
right += 1  bb.extend(a[l:mind+1])  
bb.extend(a[right:end+1])  for j in range(start, end+1):  
a[j] = bb[j - start]  print(start, end, bb)  def divide(a, start, end):  
if start == end:  
return  mind = (start + end) // 2  
divide(a, start, mind)  
divide(a, mind+1, end)  
merge(a, start, mind, end)  a = [7, 3, 9, 8, 7]  
divide(a, 0, 4)  # 第二種  
# 因為在Python中,列表是可變的數據類型,也就是說,當你傳遞一個列表到一個函數中時,你實際上是傳遞了這個列表的引用,而不是它的副本。這意味著如果你在函數中修改了這個列表,那么這個改變將會影響到原始的列表。
def merge_sort(arr, start, end):  
if start >= end:  
return  
mid = (start + end) // 2  
merge_sort (arr, start, mid)  
merge_sort (arr, mid + 1, end)  
merge (arr, start, mid, end)  def merge(arr, start, mid, end):  
left = arr[start:mid + 1]  
right = arr[mid + 1:end + 1]  i = j = 0  
k = start  while i < len (left) and j < len (right):  
if left[i] <= right[j]:  
arr[k] = left[i]  
i += 1  
else:  
arr[k] = right[j]  
j += 1  
k += 1  while i < len (left):  
arr[k] = left[i]  
i += 1  
k += 1  while j < len (right):  
arr[k] = right[j]  
j += 1  
k += 1  a = [6, 1, 4, 1, 7]  
merge_sort (a, 0, len (a) - 1)  
print (a)

值得好好研究和閱讀,比較像遞歸和分治

三顆星–桶排序

這個還是比較好理解的

from xuanzhe_paixu import xuanzhe_paixu as slect  
def tong_paixu(a):  
Min=min(a)  
Max=max(a)  
bucket_len=(Max-Min)//3+1 #將計算長度的線段分出來算出每個桶的長度  
bucket= [[] for _ in range(3)]  
for sum in a:  
bucket[(sum-Min)//bucket_len].append(sum) # 相減能夠計算線段,相除能夠計算幾倍桶長度  
bb=[]  
for arry in bucket:  
result=slect(arry)  
print(result)  
for i in result:  
bb.append(i)  
return bb  
b=[6,4,7,1,8,6,4,8,7]  
d=tong_paixu(b)  
print(d)

三顆星–計數排序

def jisu_paixu(arry):  
Max=max(arry)+1  
b=[0]*Max  
a=[]  
for each in arry:  
b[each]+=1  
for index,i in enumerate(b):  
if i!=0:  
for j in range(i):  
a.append(index)  
print(a)  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
jisu_paixu(d)  # 第二種  
def jisu_paixu1(arry):  
Max = max (arry) + 1  
b = [0] * Max  
for each in arry:  
b[each]+=1  
print(b)  
c=[]  
for index in range(Max):  
while b[index] >0:  
c.append(index)  
b[index]-=1  
return c  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
result=jisu_paixu1(d)  
print(result)

四顆星–基數排序

就是將得到的列表通過迭代,實現每次少一個數,將最后一個數按數字放入對應的桶中,需要創建一個二維列表,和清空一個二維列表,這個很重要

a = [[] for _ in range (10)]  
for i in range (10):  
a.append ([])  
def jisu_paixu(arry):  
a=[]  
Max=max(arry)  
base=1  
for i in range (10):  
a.append ([])  
while base<Max:  
n=0  
for each in arry:  
a[each//base%10].append(each)  
print(a)  
for list1 in a:  
for i in list1:  
arry[n]=i  
n+=1  
print(arry)  
base*=10  
a = [[] for _ in range (10)]  
b=[3,214,1,24,13]  
jisu_paixu(b)

四顆星–快速排序,尋找標志位(遞歸-難)

 def kuaisu_paixu(a,start,end):  if start==end:  return  flag=start  binaliang=start+1  for i in range(start+1,end):  if a[flag]>a[i]:  a[i],a[binaliang]=a[binaliang],a[i]  binaliang+=1  a[flag],a[binaliang-1]=a[binaliang-1],a[flag]     flag=binaliang-1  print(a[flag],a[start:flag],a[flag+1:end])  kuaisu_paixu(a,start,flag)  kuaisu_paixu(a,flag+1,end)  a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  kuaisu_paixu(a,0,len(a))  print(a)  # 第二種辦法  import random
def kuaisu_paixu(a,start,end):  
# random_index=random.randint(start,end-1)  
# a[start],a[random_index]=a[random_index],a[start]
# 這個是用來隨機快速排序的
flag=start  
binaliang=start+1  
for i in range(start+1,end):  
if a[flag]>a[i]:  
a[i],a[binaliang]=a[binaliang],a[i]  
binaliang+=1  
a[flag],a[binaliang-1]=a[binaliang-1],a[flag]  
flag=binaliang-1  
print(a[flag],a[start:flag],a[flag+1:end])  
return flag  
def paixu(a,start,end):  if start==end:  
return  flag=kuaisu_paixu(a,start,end)  
paixu(a,start,flag)  
paixu(a,flag+1,end)  
a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
paixu(a,0,len(a))  
print(a)

四顆星–又是比較難的希爾排序

這里面有兩種方式,一個是切片排序,一個是從頭排序
還有希爾排序就是特殊的插入排序,一定要多了解了解,加理解

# 希爾排序就是特殊的插入排序,間隔不在是1,而是gap和cha  
def xier_paixu(a):  
n=len(a)  
gap=n//2  
while gap>0:  
for i in range(gap,n):  
j=i  
while j>=gap:  
if a[j]<a[j-gap]:  
a[j],a[j-gap]=a[j-gap],a[j]  
else:  
break  
j-=gap  gap=gap//2  
a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
xier_paixu(a)  
print(a)  # 第二種  
def xier_paixu1(alist, start, end):  
n = end - start  
cha = n // 2  
while cha > 0:  
for i in range(cha + start, end):  
j = i  
while j >= start+cha:  
if alist[j] < alist[j - cha]:  
alist[j], alist[j - cha] = alist[j - cha], alist[j]  
else:  
break  
j -= cha  
cha //= 2  return alist  a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
start = 2  
end = len(a)  
print(xier_paixu1(a, start, end))

五顆星–堆排序

## 創建一個列表去執行大頂堆操作,便于排序  
def fangwen_paixu(arry):  
arry=[None]+arry  
# 將列表進行自頂向下的堆排序,不能超過索引  
for i in range(len(arry)//2,0,-1):  
dui_paixu(arry,i,len(arry)-1)  
# 將最頂堆頂端的數與最低端的數交換放入列表中,不斷縮小最低端的索引 
for i in range(len(arry)-1,0,-1):  
arry[i],arry[1]=arry[1],arry[i]  
dui_paixu(arry,1,i-1)  
return arry  
# 創建堆排序函數  
##  
def dui_paixu(a, start, end):  
head=start  
jiedian=start*2  
while(jiedian<=end):  
# 尋找葉子節點最大的值,與頭節點比較,將最大的值放入到頭節點中  
if jiedian+1<=end and a[jiedian]<a[jiedian+1]:  
jiedian+=1  
if a[head]<a[jiedian]:  
a[head],a[jiedian]=a[jiedian],a[head]  
# 進行迭代,最后遍歷完整個數組,形成大頂堆  
head,jiedian=jiedian,jiedian*2  
else:  
break
# 創建一個測試fangwen_paixu函數  
b=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
c=fangwen_paixu(b)  
#把c列表里面的NONE去掉  
c.pop(0)  
print(c)

記得多看視頻多理解理解,反復觀看

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

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

相關文章

Python工具箱系列(四十六)

PDF&#xff08;Portable Document Format&#xff09;是一種便攜文檔格式&#xff0c;它基于PostScripty這種腳本語言。 ?? PDF文檔操作 PDF&#xff08;Portable Document Format&#xff09;是一種便攜文檔格式&#xff0c;它基于PostScripty這種腳本語言&#xff0c;它…

清華大學提出全新加速訓練大模型方法SoT

近日&#xff0c;微軟研究和清華大學的研究人員共同提出了一種名為“Skeleton-of-Thought&#xff08;SoT&#xff09;”的全新人工智能方法&#xff0c;旨在解決大型語言模型(LLMs)生成速度較慢的問題。 盡管像GPT-4和LLaMA等LLMs在技術領域產生了深遠影響&#xff0c;但其處…

提供電商數據|帶你簡單認識天貓API接口相關參數文檔調用說明

什么是API接口 API接口(Application Programming Interface Interface)是應用程序與開發人員或其他程序互相通信的方式。它允許開發者訪問應用程序的數據和功能。 API接口,軟件的“握手”與“交流”之道,軟件世界的“好基友”。想讓軟件聊得來?想開發App卻無從下手?API來相救…

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB為非結構化數據查詢插上飛翔的翅膀——以企業知識庫為例

前言 以前我曾疑惑&#xff0c;對于非結構化的內容&#xff0c;如一張圖片或一段視頻&#xff0c;如何實現搜索呢&#xff1f;圖片或視頻作為二進制文件&#xff0c;我們如何將其轉化為可搜索的數據并存儲起來&#xff0c;然后在搜索時將其還原呢&#xff1f; 后來我發現&…

5個高防CDN的特點

1. 支持泛解析自定義HTTPS/SSL隱藏源IP。 2. 支持緩存加速永久在線SEO優化。當網站原服務器宕機時&#xff0c;如果開啟了此功能&#xff0c;用戶仍然可以訪問網站&#xff08;用戶看到的是 緩存數據&#xff09;&#xff0c;從而達到了網站永不中斷服務的效果&#xff0c;可以…

Minio8版本沖突問題

今天在配置minio的時候遇到了一個報錯 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-11-24 10:31:42.897 ERROR 14312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *******************…

blk_mq_init_queue函數學習記錄

blk-mq編程&#xff0c;主要要調用兩個函數進行初始化工作&#xff0c;blk_mq_init_queue這是第二個。該函數先是申請了struct request_queue結構&#xff0c;這個請求隊列后面用于賦值給磁盤那個結構體的相應成員。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…

python3到文件的讀取以及輸出

excel表格的讀取和輸入輸出 python中txt的讀取和輸入輸出 txt輸出報錯&#x1f447; UnicodeEncodeError: ascii codec cant encode characters in position 154-157: ordinal not in range(128)解決方法

Tomcat 配置

1&#xff1a; 打開 2&#xff1a;選擇版本號&#xff0c;我這邊是 1.7 3&#xff1a;添加 web 4: 添加jar包 5&#xff1a;添加 6&#xff1a;添加 Tomcat

【每日一題】1410. HTML實體解析器-2023.11.23

題目&#xff1a; 1410. HTML 實體解析器 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們對應的字符實體包括&#xff1a; 雙引號&#xff1a;字符實體為 &…

vim翻頁快捷鍵

Vim翻頁 整頁 Ctrlf向下翻頁&#xff0c;下一頁&#xff0c;相當于Page DownCtrlb向上翻頁&#xff0c;上一頁&#xff0c;相當于Page Up 半頁 Ctrld向下半頁&#xff0c;下一半頁&#xff0c;光標下移Ctrlu向上半頁&#xff0c;上衣半頁&#xff0c;光標上移 按行 Ctrle…

vue2【組件的構成】

目錄 1&#xff1a;什么是組件化開發 2&#xff1a;vue中的組件化開發 3&#xff1a;vue組件的三個組成部分 4&#xff1a;組件中定義方法&#xff0c;監聽器&#xff0c;過濾器&#xff0c;計算屬性節點。 5&#xff1a;template中只允許唯一根節點&#xff0c;style默認…

OpenMLDB SQL 開發調試神器 - OpenMLDB SQL Emulator

今天為大家介紹一款來自 OpenMLDB 社區的優秀獨立工具 - OpenMLDB SQL Simulator&#xff08;https://github.com/vagetablechicken/OpenMLDBSQLEmulator&#xff09; &#xff0c;可以讓你更加高效方便的開發、調試 OpenMLDB SQL。 為了高效的實現時序特征計算&#xff0c;Op…

高質量短效SOCKS5代理IP是什么意思?作為技術你了解嗎

小張是一位網絡安全技術測試員&#xff0c;最近他接到了一個頭疼的任務&#xff0c;那就是評估公司系統的安全性&#xff0c;因此他前來咨詢&#xff0c;在得知SOCKS5代理IP可以幫他之后&#xff0c;他不禁產生疑問&#xff0c;這是什么原理&#xff1f;其實和小張一樣的朋友不…

命令查詢職責分離 (CQRS)

CQRS 的最初需求 多年來&#xff0c;傳統的 CRUD&#xff08;創建、讀取、更新、刪除&#xff09;模式一直是系統架構的支柱。在 CRUD 中&#xff0c;讀取和寫入操作通常由相同的數據模型和相同的數據庫模式處理。雖然這種方法簡單直觀&#xff0c;但隨著系統規模的擴大和需求…

第99步 深度學習圖像目標檢測:SSDlite建模

基于WIN10的64位系統演示 一、寫在前面 本期&#xff0c;我們繼續學習深度學習圖像目標檢測系列&#xff0c;SSD&#xff08;Single Shot MultiBox Detector&#xff09;模型的后續版本&#xff0c;SSDlite模型。 二、SSDlite簡介 SSDLite 是 SSD 模型的一個變種&#xff0c…

竹云參編《公共數據授權運營平臺技術要求》團體標準正式發布

2023年11月23日&#xff0c;第二屆全球數字貿易博覽會“數據要素治理與市場化論壇”于杭州成功召開&#xff0c;國家數據局黨組書記、局長劉烈宏&#xff0c;浙江省委常委、常務副省長徐文光出席會議并致辭。會上&#xff0c;國家工業信息安全發展研究中心發布并解讀了我國首部…

[Linux] 馮諾依曼體系結構 與 操作系統

文章目錄 1、馮諾依曼體系結構2、操作系統 1、馮諾依曼體系結構 馮諾依曼結構也稱普林斯頓結構&#xff0c;是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置&#xff0c;因此程序指令和數據的寬度相…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現省市地區三級聯動地址選擇器組件(下)

文章目錄 概述端云調用流程端側集成AGC SDK端側省市地區聯動的地址選擇器組件開發創建省市數據模型創建省市地區視圖UI子組件創建頁面UI視圖Page文件 打包測試總結 概述 我們在前面的課程&#xff0c;對云開發的入門做了介紹&#xff0c;以及使用一個省市地區聯動的地址選擇器…

三次輸錯密碼后,系統是怎么做到不讓我繼續嘗試的?

1故事背景 忘記密碼這件事&#xff0c;相信絕大多數人都遇到過&#xff0c;輸一次錯一次&#xff0c;錯到幾次以上&#xff0c;就不允許你繼續嘗試了。 但當你嘗試重置密碼&#xff0c;又發現新密碼不能和原密碼重復&#xff1a; 圖片 相信此刻心情只能用一張圖形容&#xf…