python快速排序函數_python算法-快速排序

快速排序:

學習快速排序,要先復習下遞歸:

遞歸的2個條件:

1. 函數自己調用自己

2.有一個退出的條件

練習:基于遞歸下一個函數,計算n!并且求出當n等于10的值。

n!=n * n-1*…..*1

#enconding = utf-8

def func(n):

if n<=1:

return 1

else:

return n*func(n-1)

print func(10)

結果:3628800

快速排序:也是基于遞歸的思想

核心思想:對于一個數組 12 23 3 4 56 21

快排是從里面隨機選擇一個數,如21,把所有小于這個數字的排在它的左邊,把所有大于它的數排在右邊。

用指針指明位置,遍歷數組:j-> 0到4

用i表示下標i左邊的都是小于21的,包括下標i

初始值 i=-1 -1是針對最小數剛好在最后一位的極端情況

初始值j=0 ,j控制遍歷數組的下標。

用j去和21比較,如果大于21,則空過不處理;如果小于21:i要加1,把i和j指向的元素交換位置

手工排序:

i=-1 j=0

取出12,12<21-à i+1=0;i和j指向的元素交換位置,此時i=j=0,都是指向lista[0];j++

12 23 3 4 56 21

i=0,j=1

取出23,21 23>21,空過

12 23 3 4 56 21

i=0 ,j=2

取出3,21, 3<21-> i+1=1;i和j對應元素位置交換,lista[1],lista[2] =

12 3 23 4 56 21

i=1 j=3

取出4<21,i+1=2; i和j對應元素位置交換

12 3 4 23 56 21

i=1;j=4

取出56>21;空過

12 3 4 23 56 21

把下標i+1的元素和最后一個元素交換位置

12 3 4 21 56 23

這樣,就完成了第一輪的排序。

為什么要選擇最后一個數字呢?

很容易找到。其實選擇哪一個最后的結果都是一樣的。因此為了簡單我們直接就取的最后一個數作為基準數字。

下面,我們來寫出12 3 4 以及右子列表56 23快排一次后的結果

左: 3 4 12

右:23 56

快排程序:

1.對于listx調用快排

2.對于listx的左子列表12 3 4進行快排,對于listx的右子列表56 23進行快排

3.直到列表只有一個元素的時候,退出

#enconding = utf-8

def Quick_Sort(lista):

def pathSort(lista,sIndex,eIndex):#第一重排序

flag = lista[eIndex]

i = sIndex - 1

for j in xrange(sIndex,eIndex):

if lista[j]

i+=1

lista[i],lista[j] = lista[j],lista[i]

else:

pass

lista[eIndex],lista[i+1] = lista[i+1],lista[eIndex]

return i+1

def qSort(listb,sIndex,eIndex):

if sIndex >= eIndex: #如果開始位置大于等于起始位置,返回

return

middle = pathSort(listb,sIndex,eIndex)

#遞歸調用左子列表

qSort(listb,sIndex,middle-1)

#遞歸調用右子列表

qSort(listb,middle+1,eIndex)

qSort(lista,0,len(lista)-1)

return lista

if __name__ == '__main__':

print Quick_Sort([12,3,4,21,56,23])

變形練習1:修改成從大到小排列。

#enconding = utf-8

def Quick_Sort(lista):

def pathSort(lista,sIndex,eIndex):#第一重排序

flag = lista[eIndex]

i = sIndex - 1

for j in xrange(sIndex,eIndex):

if lista[j]>flag:

i+=1

lista[i],lista[j] = lista[j],lista[i]

else:

pass

lista[eIndex],lista[i+1] = lista[i+1],lista[eIndex]

return i+1

def qSort(listb,sIndex,eIndex):

if sIndex >= eIndex: #如果開始位置大于等于起始位置,返回

return

middle = pathSort(listb,sIndex,eIndex)

#遞歸調用左子列表

qSort(listb,sIndex,middle-1)

#遞歸調用右子列表

qSort(listb,middle+1,eIndex)

qSort(lista,0,len(lista)-1)

return lista

if __name__ == '__main__':

print Quick_Sort([12,3,4,21,56,23])

時間復雜度:

第一輪:做完快排后發現基準數是最大的一個,我們比較了n-1次,最后一個

第二輪:n-2次

第三輪:n-3次

第n-1輪:1次

1+2+3….+n-1 = n^2/2

時間復雜度為O(nlogn)

平均情況:

n

第一輪:n-1,排列出2個列表,確定了1個結點的位置

第二輪:n-3,排列出4個列表,確定了3個結點的位置

第三輪:n-7,排列出8個列表,確定了7個結點的位置

第四輪:n-15,排列 出16個列表,確定了15個結點的位置

…..

平均比較次數n-x

2^i-1

總共需要多少輪,才能完成快排?

2^1 + 2^2 +…..2^i-I = n

2*(1-2^i)/1 -2 –I =n

2^(i+1)-2-I =n

i+1 ~ logn

I ~ logn

log(n-x)

最終時間復雜度為 O(nlogn)

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

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

相關文章

c語言課程結束,【計算機】程序設計——C語言基礎秋季學期課程圓滿結束

2019年10月22日11&#xff1a;40&#xff0c;在同學們發自內心的掌聲中&#xff0c;課外培養中心開辦的程序設計——C語言基礎課程圓滿落幕。本次課程由計算機中心的陶媛老師予以指導&#xff0c;在短短五次課的時間里&#xff0c;同學們對學習C語言都有了更深的體悟。對于大部…

struts2獲取請求參數的三種方式及傳遞給JSP參數的方式

接上一篇文章package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import java.util.*; public class HelloAction extends ActionSup…

iOS input被鍵盤遮擋

//解決第三方軟鍵盤喚起時底部input輸入框被遮擋問題var bfscrolltop document.body.scrollTop;//獲取軟鍵盤喚起前瀏覽器滾動部分的高度$("input.inputframe").focus(function(){//在這里‘input.inputframe’是我的底部輸入欄的輸入框&#xff0c;當它獲取焦點時觸…

CentOS6.5 搭建Open***服務器

前言&#xff1a;之前搭建過程中找了5-6個教程一起看&#xff0c;真是累&#xff0c;難道就沒有寫的詳細一點&#xff0c;一次成功的嗎&#xff0c;基于此花了一下午制作了本教程&#xff0c;實際測試2遍均成功&#xff0c;懶人福音。基礎環境&#xff1a;系統&#xff1a;Cent…

python如何在exel中編程_如何使用Python以編程方式將行添加到現有Excel表中

盡管有各種各樣的pythonexcel操作庫和資源&#xff0c;但我無法找到具體的解決方案。在 現在&#xff0c;我有一個表格存在的Excel模板文件。我想編寫一個Python程序來填充這個表。對于任何現有的Excel庫都可以這樣做嗎&#xff1f;模板Excel文件包含一個空表的工作表&#xff…

c語言文件分屏顯示,通用子目錄文件顯示方法

通用子目錄文件顯示方法在用CHKDS/V對磁盤子目錄及子目錄文件進行查找時,由于輸出顯示信息沒有分屏顯示,很容易錯過需要的信息,并且顯示信息沒有標記出隱藏的子目錄名及子目錄文件名,這樣就對進一步的子目錄及文件操作帶來許多不便。若輔以管道操作采用CHKDSK/V:|MORE,雖然可分…

hibernate--

正向工程&#xff1a; 通過創建Java代碼生成表文件 反向工程&#xff1a; 把表創建完自動生成代碼 轉載于:https://www.cnblogs.com/Catherinezhilin/p/9687126.html

Javascript、Dom、JQuery

1、Javascript JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。 1.1 存在形式 1 1、文件形式 2 <script src"../jqu…

mysql鏡像_Mysql phpmyadmin docker鏡像安裝

前言1.介于mysql的安裝很容易出現各種坑&#xff0c;本文使用 mysql 的docker鏡像2.為了方便管理mysql數據庫又不暴露mysql服務&#xff0c;所以使用phpmyadmin管理pull鏡像#下載mysql鏡像docker pull mysql#下載phpmyadmin鏡像docker pull phpmyadmin/phpmyadmin創建網絡docke…

linux安裝lrzsz,并使用rz sz 命令

1 centeos中使用 yum -y install lrzsz 命令下載并安裝 2 使用 rz 命令將windows文件上傳到linux 3 使用 sz 命令將linux文件下載到windows 例如&#xff1a; 4 tar zcvf dbq.tar.gz files/ 打包指定文件夾 5 sz dbq.tar.gz 轉載于:https://www.cnblogs.com/shaner/p/6387516.h…

c語言智能小車項目的感想,智能小車畢業論文(完整版)要點分析.doc

學 士 學 位 論 文系 別&#xff1a; 計算機科學與技術學科專業&#xff1a; 計算機科學與技術姓 名&#xff1a; 2011年 0月智能小車引導控制系統的設計與實現系 別&#xff1a; 計算機科學與技術學科專業&#xff1a;姓 名&#xff1a;2011年 0月智能小車引導控制系統的設計與…

慈不掌兵,義不行賈,爛好人難成大業!

兩個月前&#xff0c;朋友的創業公司倒閉了。 朋友是溫文爾雅的白面君子&#xff0c;有著光鮮的履歷和出眾的能力。和他聊天&#xff0c;永遠覺得沐浴春風。溫潤如玉&#xff0c;充滿魅力。 朋友細致而體貼。他記得你的生日時&#xff0c;并在那天給發送祝福和紅包&#xff1b;…

maven項目構建

Maven是apache的一個開源項目。是一個用來把源代碼構建成可發布的構件的工具。 Maven的功能非常強大&#xff0c;可以認為是一個項目管理工具&#xff0c;不僅僅是一個構建工具。 Maven本身的核心很小&#xff0c;但是可以在上面擴展出很多的插件。Mven采用的是插件的思想&…

c++如何打開hdf5文件_如何打開CSV格式文件才能正常使用?

正文開始前先給大家來一波福利&#xff0c;歡迎大家掃碼關注后&#xff0c;手動發送“薪酬”領取《企業薪酬管理必備資料包》&#xff01;注意&#xff1a;先掃碼關注再回復回復關鍵詞&#xff01;先掃碼關注再回復回復關鍵詞&#xff01;先掃碼關注再回復回復關鍵詞&#xff0…

Linux驅動技術(四) _異步通知技術

異步通知的全稱是"信號驅動的異步IO"&#xff0c;通過"信號"的方式&#xff0c;放期望獲取的資源可用時&#xff0c;驅動會主動通知指定的應用程序&#xff0c;和應用層的"信號"相對應&#xff0c;這里使用的是信號"SIGIO"。操作步驟是…

陜理工高級語言程序設計實驗 (C)答案,陜理工高級語言程序計實驗 (C)模板.doc

陜理工高級語言程序計實驗 (C)模板《高級語言程序設計(C)》實驗報告目錄實驗一&#xff1a;C開發環境與順序結構程序設計21&#xff0e;實驗目的&#xff1a;22&#xff0e;實驗環境&#xff1a;23&#xff0e;實驗步驟&#xff1a;24&#xff0e;實驗內容&#xff1a;25&#…

java集合(1)-概述

Java集合類是一種特別有用的工具類,可用于存儲數量不等的對象,并可以實現常用的數據結構,如棧,隊列等,此外Java集合還可以用于保存具有映射關系的關聯數組.java集合大致可分為Set,List,Queue和Map四種體系,其中Set代表無序,不可重復的集合;List代表有序,重復的集合;而Map則代表…

UVA1262Password(第K字典序)

題目鏈接 紫書P323 題意&#xff1a;兩個6*5的字母矩陣&#xff0c;兩個矩陣每列相同的字母&#xff0c;每列取一個&#xff0c;求按照字典序第k小的序列 分析&#xff1a; 對于第一個樣例來說&#xff0c;我們得到{ACDW}、{BOP}、{GMOX}、{AP}、{GSU} 則一共有43423288種密碼&…

自定義 View 循環滾動刻度控件

LoopScaleView 先看效果圖: enter description hereLoopScaleView 是一個自定義的刻度尺風格的選值控件,從上面的動圖大家可以看到 LoopScaleView 的運行效果.可以設置屏幕內顯示的刻度數,也可以設置每一個刻度代表的值得大小。 LoopScaleView.class Nested class OnValueChang…

go 類型斷言_(57)接口的類型斷言

GO提供了一個方法&#xff0c;用來判斷接口的底層值是什么類型類型斷言 提供了訪問接口值底層具體值的方式。t : i.(T)該語句斷言接口值 i 保存了具體類型 T&#xff0c;并將其底層類型為 T 的值賦予變量 t。若 i 并未保存 T 類型的值&#xff0c;該語句就會觸發一個panic。為了…