數據結構與算法--5.Python實現十大排序算法

文章目錄

  • 0. 相關概念
  • 一. 冒泡排序
  • 二. 選擇排序
  • 三. 插入排序
  • 四. 希爾排序
  • 五. 快速排序
  • 六. 歸并排序
  • 七. 其他

0. 相關概念

  • 穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不穩定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現在 b 的后面。
  • 時間復雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什么規律。
  • 空間復雜度:是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。
    在這里插入圖片描述

一. 冒泡排序

算法過程:
進行N-1趟操作,每一趟,都是不斷的比較相鄰的元素,那么一趟下來,就會將最大的移到排好順序的最后面的位置。
在這里插入圖片描述

代碼實現:

def bubble_sort(alist):"""冒泡排序:最優時間復雜度:O(n)最壞時間復雜度:O(n^2)穩定性:穩定"""n = len(alist)for j in range(n-1):for i in range(0,n-1-j):if alist[i] > alist[i+1]:alist[i],alist[i+1] = alist[i+1],alist[i]return liif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)li = bubble_sort(li)print(li)

二. 選擇排序

在這里插入圖片描述

算法過程:
初始狀態:無序區為R[1…n],有序區為空;

第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為R[1…i-1]和R(i…n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1…i]和R[i+1…n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;

n-1趟結束,數組有序化結束。

代碼實現:

def select_sort(alist):"""選擇排序最優時間復雜度:O(n^2)最壞時間復雜度:O(n^2)穩定性:不穩定"""n = len(alist)for j in range(n-1):min_index = jfor i in range(j+1,n):if alist[min_index] > alist[i]:min_index = ialist[j],alist[min_index] = alist[min_index],alist[j]if __name__ == '__main__':li = [54,26,93,17,77,26,31,44,55,20]print(li)select_sort(li)print(li)

三. 插入排序

在這里插入圖片描述
算法過程:
從第一個元素開始,該元素可以認為已經被排序;

取出下一個元素,在已經排序的元素序列中從后向前掃描;

如果該元素(已排序)大于新元素,將該元素移到下一位置;

重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;

將新元素插入到該位置后;

重復步驟2~5。

代碼實現:

def insert_sort(alist):"""插入排序:最優時間復雜度:O(n)最差時間復雜度:O(n^2)穩定性:穩定"""n = len(alist)for j in range(1, n):i = jwhile i > 0:if alist[i] < alist[i-1]:alist[i], alist[i-1] = alist[i-1], alist[i]i -= 1else:breakif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)insert_sort(li)print(li)

四. 希爾排序

在這里插入圖片描述

算法過程:
選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列個數k,對序列進行k 趟排序;

每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

代碼實現:

def shell_sort(alist):"""shell排序:最優時間度:根據步長序列的不同而不同最差時間度:O(n^2)穩定性:不穩定"""n = len(alist)gap = n // 2while gap > 0:# 希爾排序與插入排序的區別就是gap步長for j in range(gap,n):i = jwhile i > 0:if alist[i] < alist[i - gap]:alist[i], alist[i-gap] = alist[i-gap], alist[i]i -= gapelse:break# 縮短gap步長gap //= 2if __name__ == '__main__':li = [54,26,93,17,77,26,31,44,55,20]print(li)shell_sort(li)print(li)

五. 快速排序

在這里插入圖片描述
算法過程:
從數列中挑出一個元素,稱為 “基準”(pivot);

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

遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。

代碼實現:

def quick_sort(alist,first,last):"""快速排序:最優復雜度:O(nlogn)最壞復雜度:O(n^2)穩定性:不穩定"""if first >= last:returnmid_value = alist[first]low = firsthigh = lastwhile low < high:while low < high and alist[high] >= mid_value:high -= 1alist[low] = alist[high]while low < high and alist[low] < mid_value:low += 1alist[high] = alist[low]# 從循環退出時,low=highalist[low] = mid_value# 對low左邊的列表執行快速排序quick_sort(alist,first,low-1)# 對low右邊的列表排序quick_sort(alist,low+1,last)if __name__ == '__main__':li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)quick_sort(li, 0, len(li)-1)print(li)

六. 歸并排序

在這里插入圖片描述
算法過程:

把長度為n的輸入序列分成兩個長度為n/2的子序列;

對這兩個子序列分別采用歸并排序;

將兩個排序好的子序列合并成一個最終的排序序列。

代碼實現:

def merge_sort(alist):"""歸并排序最優時間度:最壞時間度:穩定性:"""n = len(alist)if n <= 1:return alistmid = n//2# left采用歸并排序后形成的有序的新的列表left_li = merge_sort(alist[:mid])# right采用歸并排序后形成的有序的新的列表right_li = merge_sort(alist[mid:])# 將兩個有序的子序列合并為一個新的整體left_pointer,right_pointer = 0,0result = []while left_pointer<len(left_li) and right_pointer<len(right_li):if left_li[left_pointer] < right_li[right_pointer]:result.append(left_li[left_pointer])left_pointer += 1else:result.append(right_li[right_pointer])right_pointer += 1result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == '__main__':li = [54,26,93,17,77,31,44,55,20]print(li)li_sort = merge_sort(li)print(li_sort)

七. 其他

其他算法的詳細過程請參考:https://blog.csdn.net/weixin_41571493/article/details/81875088

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

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

相關文章

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 問題

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 maven run as --install 時出錯&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各組件常用配置參數

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 設為false&#xff0c;關閉自我保護eureka.server.eviction-interval-timer-in-ms # 清理間隔&#xff08;單位毫秒&#xff0c;默認是60*1000&#xff09;eureka.environmentdev #指定環境eureka…

JSON與XML的區別比較

1.定義介紹 (1).XML定義 擴展標記語言 (Extensible Markup Language, XML) &#xff0c;用于標記電子文件使其具有結構性的標記語言&#xff0c;可以用來標記數據、定義數據類型&#xff0c;是一種允許用戶對自己的標記語言進行定義的源語言。 XML使用DTD(document type defini…

ajax傳遞數組:屬性traditional設置

jQuery.ajaxSettings.traditional true; $.post("",function(){});轉載于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面試題總結(9)--高級特性

文章目錄1. 函數裝飾器有什么作用&#xff1f;請列舉說明&#xff1f;2. Python 垃圾回收機制&#xff1f;3. 魔法函數 _call_怎么使用?4. 如何判斷一個對象是函數還是方法&#xff1f;5. classmethod 和 staticmethod 用法和區別6. Python 中的接口如何實現&#xff1f;7. Py…

I/O流講解

本文來自&#xff1a;曹勝歡博客專欄&#xff1a;http://blog.csdn.net/csh624366188 在軟件開發中&#xff0c;數據流和數據庫操作占據了一個很重要的位置&#xff0c;所以&#xff0c;熟悉操作數據流和數據庫&#xff0c;對于每一個開發者來說都是很重要的&#xff0c;今天就…

Spring Boot入門(9)網頁版計算器

介紹 在寫了前八篇Spring Boot項目的介紹文章后&#xff0c;我們已經初步熟悉了利用Spring Boot來做Web應用和數據庫的使用方法了&#xff0c;但是這些僅僅是官方介紹的一個例子而已。 ??本次分享將介紹筆者自己的一個項目&#xff1a;網頁版計算器&#xff0c;以這兩篇博客…

shell編程基礎(七): 處理文件命令sed與awk

一、sed&#xff08;以行為單位處理文件&#xff09; sed意為流編輯器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell腳本和Makefile中作為過濾器使用非常普遍&#xff0c;也就是把前一個程序的輸出引入sed的輸入&#xff0c;經過一系列編輯命令轉換為另一種格式輸…

數據結構與算法--6.二分查找

文章目錄一. 二分查找二. 代碼實現一&#xff1a;使用遞歸三. 代碼實現二&#xff1a;非遞歸一. 二分查找 二. 代碼實現一&#xff1a;使用遞歸 def binary_search(alist, item):"""二分查找&#xff1a;使用遞歸"""n len(alist)if n > 0:m…

SpringMVC請求處理流程、springMVC工作流程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 頁面請求到來 --> 前端控制器&#xff08;DispatcherServlet&#xff09;收到請求&#xff0c;請求 處理映射器&#xff08;Hanle…

Android的TextView在顯示文字的時候,如果有段中文有英文,有中文,有中文標點符號,你會發現,當要換行的時候遇到中文標點, 這一行就會空出很多空格出來...

一、問題描述&#xff1a; Android的TextView在顯示文字的時候&#xff0c;如果有段中文有英文&#xff0c;有中文&#xff0c;有中文標點符號&#xff0c;你會發現&#xff0c;當要換行的時候遇到中文標點&#xff0c; 這一行就會空出很多空格出來。原因是&#xff1a; 1&…

什么是IDE

集成開發環境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序開發環境的應用程序&#xff0c;一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務…

vue 學習

http://jspang.com/ vue 學習 vue 學習 轉載于:https://www.cnblogs.com/qianjin888/p/9342031.html

策略模式-Strategy Pattern

解決問題 將算法按照策略或場景封裝起來&#xff0c;以方便按照不同的場景執行不同的策略。它很好的解決了通過if...else 來決策行為而帶來的代碼和邏輯復雜性。 應用場景 一個經常被拿來舉例的場景是收銀員收銀場景&#xff1a;它需要根據不同的場景&#xff08;是否為會員、有…

ssm框架下 tiles框架 的使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 tiles框架的工作 在springMVC工作流程中屬于視圖解析器 解析視圖這一步。算是視圖解析器的一個插件&#xff0c;作了視圖解析這步的一部…

數據結構與算法--7.樹的基礎知識

文章目錄一. 樹的概念二. 樹的術語三. 樹的種類四. 樹的存儲和表示五. 常見的樹的應用場景一. 樹的概念 二. 樹的術語 三. 樹的種類 四. 樹的存儲和表示 五. 常見的樹的應用場景

運用java 多線程模擬火車售票。。。。

public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub //多線程并行時&#xff0c;會出現的問題 //同步&#xff1a; //買火車票&#xff0c;四個窗口A,B,C,D //創建任務 TicketTask task new TicketTask(); //四個窗口A,B,C,…