【數據結構】——快速排序

?

目錄

一、代碼

二、復雜度:O(nlog(n))

三、快速排序的劣勢


視頻參考鏈接:https://www.bilibili.com/video/BV1mp4y1D7UP?p=17

一、代碼

'''
思想:假設是對一個list進行排序
1、選取第一個元素作為p元素;
2、將p元素歸位,即將小于p元素的元素放在列表左邊,將大于p元素的元素放在列表右邊
3、通過2實現了p元素的歸位,這樣就將列表分成了兩個子列表,對左右兩個子列表重復使用1、2步驟,實現快速排序
'''
import timedef partition1(li:list,left:int,right:int)->int:'''這是根據路飛商城的思路來的將p元素歸位的函數:取第一個元素為p元素,移動right,若right指針的值大于P,則right繼續往左移動,否則停止移動,將值賦值給left所在的位置;然后再移動left,若left指針的值小于P,則left繼續往右移動,否則停止移動,將值賦值給right所在的位置;如此交替移動,直到left=right時,停止,并將P值賦值給left(right):param li: 需要歸位的列表:param left: 列表左指針索引,初始值為0:param right: 列表右指針索引,初始值為len(li)-1:return: 返回p歸位的索引'''#得到要歸位的元素(第一個元素)p = li[left]#當列表有兩個元素時,才進行排序while left < right:# 保證有兩個元素#這里我們從列表的右邊開始進行元素的比較while left < right and p <= li[right]: # 至少兩個元素并且p元素值小于等于right指針指向的值時,右指針左移right -= 1 # right 左移一步li[left] = li[right] # 不滿足上述循環條件時,停止移動right,并且將right上的值賦值給left#右指針停止移動后,開始進行左指針的移動while left < right and p >= li[left]:left += 1li[right] = li[left]#當left = right時,說明已經歸位了,將p賦值給歸位位置li[left] = preturn leftdef quickSorted1(li,left,right):'''對列表進行快排:param li: 需要排序的列表:param left: 左索引:param right: 右索引:return: 返回排好序的列表'''if left < right:mid = partition1(li, left, right)  # 首先得到第一個歸位索引# 對左邊列表進行排序quickSorted1(li,left,mid-1)# 對右邊列表進行排序quickSorted1(li,mid + 1,right)#-----------------------------------------------------------------------def partition2(li,left,right):'''這個的主要思路是自己的思路主要思路就是左右交替進行比較,然后將沒有元素的位置賦值為None,如當p>右指針的值時,先將right的值賦值給left,再將right值賦值為None,:param li: :param left: :param right: :return: '''p = li[left]li[left] = Nonewhile left < right:if li[left] == None: # 若檢測到左指針為空時if p > li[right]: # 若p元素大于right指向的值時li[left] = li[right] # 將right值賦值給leftli[right] = None # 此時right為空print(li,"right")else:right -= 1 # 若p元素小于right值,則right左移else:if p < li[left]: # 若p元素小于left指向的值時li[right] = li[left] # 將left值賦值給rightli[left] = None # 此時left為空print(li, "left")else:left += 1 # 若p元素大于left值,則left右移li[left] = preturn leftdef quickSorted2(li,left,right):'''對列表進行快排:param li: 需要排序的列表:param left: 左索引:param right: 右索引:return: 返回排好序的列表'''if left < right:mid = partition2(li, left, right)  # 首先得到第一個歸位索引# 對左邊列表進行排序quickSorted2(li,left,mid-1)# 對右邊列表進行排序quickSorted2(li,mid + 1,right)li = [5,7,4,6,3,1,2,9,8]
startTime1 = time.time()
quickSorted1(li,0,len(li)-1)
endTime1 = time.time()
print(li,"method1")
print("method1用時:%9f"%(endTime1-startTime1))#-----------------------------------------------------startTime2 = time.time()
quickSorted2(li,0,len(li)-1)
endTime2 = time.time()
print(li,"method2")
print("method2用時:%9f"%(endTime2-startTime2))

二、復雜度:O(nlog(n))

當需要排序的元素個數少的時候,二者的運算速度沒有什么區別,但是當數字為10000的時候,就會發生比較大的差別

第一種方法:0.04897332191467285

第二種方法:直接就報遞歸棧溢出的錯誤了。。。“進程已結束,退出代碼-1073741571 (0xC00000FD)”

三、快速排序的劣勢

1、對于Python會有遞歸最大深度的限制

2、在對一組倒序的列表進行正序時,其復雜度接近于O(n^2)

解決方法:

a、每一次隨機從列表中抽取一個元素作為p元素;

b、在進行排序前,先打亂列表再進行排序,這其實是很奇妙的,通過打亂順序來提高效率,第一次聽說,但是它就是達到了這種效果,amazing~

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

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

相關文章

讀取數據庫信息構建視圖字段的備注信息,方便程序代碼生成

在很多情況下&#xff0c;我們開發都需要有一個快速的代碼生成工具用來提高開發效率&#xff0c;代碼生成工具很多信息都是讀取數據庫的表、視圖等元數據進行對象表信息的完善&#xff0c;有了這些信息&#xff0c;我們就可以在普通的實體類代碼里面添加屬性字段的中文注釋&…

Ubuntu DNS bind9 配置

下面的配置就是實現解析test.zp.com到不同的IP地址 安裝dns server軟件包$ apt-get install bind9 配置dns配置文件的路徑在/etc/bind路徑下面添加一個zone$ /etc/bind# vim /etc/bind/named.conf.local 添加下面&#xff0c;語法可以參照/etc/bind/zones.rfc1918中的語法添加&…

微博分享錯誤

昨天再做這塊的時候&#xff0c;不知怎么的點擊之后什么反應都沒有&#xff0c;程序也沒有崩&#xff0c;日志倒是輸出了這個錯誤 解決辦法&#xff1a;打開你寫分享的代碼跟API文檔對比一下創建文本、圖片或者網頁的時候是不是少寫了那個屬性&#xff0c;我這里是在創建網頁的…

C++總結筆記(十二)—— 智能指針

文章目錄前言一、智能指針是什么&#xff1f;二、示例總結前言 C對于內存管理的要求很高&#xff0c;如果不及時釋放對象內存&#xff0c;就可能會發生內存泄露或野指針等情況&#xff0c;鑒于這種情況&#xff0c;C11提出了智能指針的概念。 一、智能指針是什么&#xff1f;…

代碼生成工具之界面快速生成

界面開發&#xff0c;無論對于Web開發&#xff0c;還是Winform開發&#xff0c;都需要耗費一定的時間&#xff0c;特別對于一個數據庫字段比較多的界面&#xff0c;一般就需要在編輯界面上擺的更多的控件來做數據顯示&#xff0c;每次碰到這個&#xff0c;都有點頭痛&#xff0…

javascript - 封裝原生js實現ajax

1 /*2 * ajax方法3 */4 var Ajax function() {5 var that this;6 //創建異步請求對象方法7 that.createXHR function() {8 if(window.XMLHttpRequ…

QT對象樹、信號和槽機制

文章目錄一 、對象樹是什么&#xff1f;二、信號和槽的基本概念2.1 信號2.2 槽2.3 松散耦合2.4 特點三、示例總結一 、對象樹是什么&#xff1f; 對象樹是由父類和若干子類對象組成&#xff0c;而子類也可以由若干孫類。 QT中的對象樹是以QObject為起始父類來完成樹的構建的&a…

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路&#xff1a;將兩個有序的子列表歸并為一個有序的大列表 #歸并函數&#xff0c;假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中&#xff0c;每當進入一個新的業務項目&#xff0c;從零開始搭建一套前端項目結構是一件讓人頭疼的事情&#xff0c;就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝&#xff0c;可以統一將…

如何使用ATS提高應用的安全性

App Transport Security&#xff0c;簡短的說就是ATS&#xff0c;是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 此文未本人工作中的總結&#xff0c;特此總結。 異常場景&#xff1a; 網絡異常&#xff0c;服務器異常&#xff0c;接口異常或參考參數篡改&#xff0c;斷電&#xff0c;…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么&#xff1f; NMS&#xff08;non maximum suppression&#xff09;即非極大值抑制&#xff0c;廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序&#xff0c;復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷&#xff0c;如果前面的元素已經是排序好的&#xff0c;那就不需要再進行比較了&#xff0c;減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中&#xff0c;我們將了解不同的事件&#xff0c;ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器&#xff08;對于 ASP.NET 應用程序&#xff0c;通常為 IIS&#xff09;發送請求為起點&#xff0c;直至將請求結果返回至瀏覽器結束。在這個過程中&#xff0c;首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP&#xff08;Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣&#xff0c;是一種擬合數據的算法。區別在于mls是局部的&#xff0c;即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合&#xff0c;需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的&#xff0c;采用所…