【排序】算法(python實現)

文章目錄

  • python 排序算法
    • 1 插入排序
      • 1.1 直接插入排序
        • 算法思想
      • 1.2 希爾排序
        • 算法思想
    • 2. 選擇排序
      • 2.1 簡單選擇排序
    • 2.2 堆排序
    • 參考

在這里插入圖片描述

python 排序算法

1 插入排序

1.1 直接插入排序

算法思想

直接插入排序的核心思想就是:將數組中的所有元素依次跟前面已經排好的元素相比較,如果選擇的元素比已排序的元素小,則交換,直到全部元素都比較過。
因此,從上面的描述中我們可以發現,直接插入排序可以用兩個循環完成:

  • 第一層循環:遍歷待比較的所有數組元素

  • 第二層循環:將本輪選擇的元素(selected)與已經排好序的元素(ordered)相比較。如果:selected > ordered,那么將二者交換

      #直接插入排序def insert_sort(L):#遍歷數組中的所有元素,其中0號索引元素默認已排序,因此從1開始for x in range(1,len(L)):#將該元素與已排序好的前序數組依次比較,如果該元素小,則交換#range(x-1,-1,-1):從x-1倒序循環到0for i in range(x-1,-1,-1):#判斷:如果符合條件則交換if L[i] > L[i+1]:L[i] ,L[i+1] = L[i+1],L[i]return L
    

1.2 希爾排序

在這里插入圖片描述

算法思想

希爾排序在數組中采用跳躍式分組的策略,通過某個增量(gap初始值一般為len(元素長度)//2)將數組元素劃分為若干組,然后分組進行插入排序,這算是一趟排序,(下一趟)隨后逐步縮小增量,繼續按組進行插入排序操作,直至增量為1。希爾排序通過這種策略使得整個數組在初始階段達到從宏觀上看基本有序,小的基本在前,大的基本在后。然后縮小增量,到增量為1時,其實多數情況下只需微調即可,不會涉及過多的數據移動。
解法1:

def shell_sort(alist):"""希爾排序"""n = len(alist)gap = n // 2while gap >= 1:for j in range(gap, n):i = jwhile (i - gap) >= 0:if alist[i] < alist[i - gap]:alist[i], alist[i - gap] = alist[i - gap], alist[i]i -= gapelse:breakgap //= 2if __name__ == '__main__':alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]print("原列表為:%s" % alist)shell_sort(alist)print("新列表為:%s" % alist)

解法2:

def shell_sort(alist):gap = len(alist)while gap > 1:gap = gap // 2for i in range(gap, len(alist)):for j in range(i % gap, i, gap):if alist[i] < alist[j]:alist[i], alist[j] = alist[j], alist[i]return alistalist = shell_sort([4,5,6,7,3,2,6,9,8])
print (alist)

2. 選擇排序

2.1 簡單選擇排序

選擇排序不受輸入數據的影響,即在任何情況下時間復雜度不變。選擇排序每次選出最小的元素,因此需要遍歷 n-1 次。
在這里插入圖片描述
def selectionSort(nums):
for i in range(len(nums) - 1): # 遍歷 len(nums)-1 次
minIndex = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]: # 更新最小值索引
minIndex = j
nums[i], nums[minIndex] = nums[minIndex], nums[i] # 把最小數交換到前面
return nums

2.2 堆排序

堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

  • 大根堆:每個節點的值都大于或等于其子節點的值,用于升序排列;
  • 小根堆:每個節點的值都小于或等于其子節點的值,用于降序排列。
    在這里插入圖片描述

參考

(1).https://blog.csdn.net/mxz19901102/article/details/80087596
(2).https://www.jianshu.com/p/bbbab7fa77a2

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

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

相關文章

OpenSSL漏洞補救辦法詳解(轉)

CVE-2014-0160漏洞背景 2014年4月7日OpenSSL發布了安全公告&#xff0c;在OpenSSL1.0.1版本中存在嚴重漏洞(CVE-2014-0160)。OpenSSL Heartbleed模塊存在一個BUG&#xff0c;問題存在于ssl/dl_both.c文件中的心跳部分&#xff0c;當攻擊者構造一個特殊的數據包&#xff0c;滿足…

SharePoint 自定義WebPart之間的連接

1、創建SharePoint解決方案&#xff0c;添加兩個WebPart分別用來發送和接收&#xff1b; 2、發送值的WebPart需要繼承自IWebPartField(當然&#xff0c;根據需要還可以選擇IWebPartField,IWebPartParameters,IWebPartRow,IWebPartTable&#xff0c;具體參見msdn)&#xff0c;原…

[python 進階] 9. 符合Python風格的對象

文章目錄9.1 對象表示形式9.2 再談向量類9.3 備選構造方法9.4 classmethod與staticmethod9.5 格式化顯示9.6 可散列的Vector2d什么是可散列的數據類型9.6 可散列的Vector9.7 Python的私有屬性和“受保護的”屬性9.8 使用 __slots__ 類屬性節省空間本章包含以下話題&#xff1a;…

android軟件獲取系統簽名

有時候有的功能必須要有系統簽名才能使用&#xff0c;例如調用系統自帶的Surface.screenShot方法時&#xff0c;就必須在androidManifest.xml里聲明android:sharedUserId"android.uid.system" 但是這個時候在編譯生成的apk很有可能無法安裝的情況 并且報這個錯誤&…

Python3中的可變與不可變類型

在描述變量是否是可變類型時&#xff0c;可變與否實際上說的是對變量進行“修改”時變量的內存地址是否會發生變化&#xff0c;而非值是否可變。在Python中&#xff0c;對不可變的變量進行“修改”實際上是重新賦值&#xff0c;對可變的變量進行修改才是真正的修改&#xff0c;…

python中帶*(單星號)的變量和**(雙星號)的變量

一、*args的使用方法 *args 用來將參數打包成tuple給函數體調用二、**kwargs的使用方法 **kwargs 打包關鍵字參數成dict給函數體調用注意點&#xff1a;參數arg、*args、**kwargs三個參數的位置必須是一定的。必須是(arg,*args,**kwargs)這個順序&#xff0c;否則程序會報錯。單…

百度知道回答的依賴注入

oC 或者 DI 或者 ...一大堆的縮寫詞不管是面向對象&#xff0c;還是面向過程&#xff0c;都需要分成許多的塊&#xff0c;然后由這些部件協同工作完成任務 要協同工作就會產生依賴&#xff0c;一個方法調用另一個方法&#xff0c;一個對象包含另一個對象 如果對象A包含對象B的話…

Django model中的 class Meta 詳解

參考 (1) https://www.cnblogs.com/tongchengbin/p/7670927.html

C\C++ 獲取當前路徑

C\C 獲取當前路徑 獲取當前工作目錄是使用函數&#xff1a;getcwd。cwd指的是“current working directory”&#xff0c;這樣就好記憶了。 函數說明&#xff1a; 函數原型&#xff1a;char* getcwd(char* buffer, int len); 參數&#xff1a;buffer是指將當前工作…

[python進階]11接口:從協議到抽象基類

本章討論的話題是接口&#xff1a;從鴨子類型的代表特征動態協議&#xff0c;到使接口更明確、能驗證實現是否符合規定的抽象基類&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;。 首先&#xff0c;本章說明抽象基類的常見用途&#xff1a;實現接口時作為**超類(…

ie11瀏覽器不能顯示最新修改的程序,調試出現代碼邏輯錯誤卻依舊執行

1、問題&#xff1a;ie11瀏覽器不能顯示最新修改的程序&#xff0c;調試也不能&#xff0c;出現代碼邏輯錯誤卻依舊執行 2、百度解決方案&#xff1a;http://blog.163.com/wang_hj138126/blog/static/1408001062012631508444/ FireFox每次訪問頁面時檢查最新版本 2012-07-31 …

C# 基礎備忘錄

1. decimal 類型調用ToString()方法后沒把末尾的0去掉的解決辦法: 例子&#xff1a;decimal? money Convert.ToDecimal(10.8950);string moneyStrmoney.Value.ToString(); 結果在同一臺機子&#xff0c;兩個項目里面會出現兩個不同的結果。結果一&#xff1a;moneyStr"1…

[python進階]12.繼承的優缺點

本章探討繼承和子類化&#xff0c;重點是說明對 Python 而言尤為重要的兩個細節&#xff1a; 子類化內置類型的缺點多重繼承和方法解析順序 12.1 子類化內置類型很 12.2 多重繼承和方法解析

Android中用GridView實現九宮格的兩種方法(轉)

Android中用GridView實現九宮格的兩種方法http://blog.csdn.net/shakespeare001/article/details/7768455 1.傳統辦法&#xff1a;實現一個繼承BaseAdapter的 ImageAdapter package com.test; import android.app.Activity; import android.content.Context; import andro…

django框架中的模型

文章目錄關聯關系Many-to-one relationshipsMany-to-many relationshipsdjango學習——model中的get和filter方法的區別模型模型是您的數據唯一而且準確的信息來源。它包含您正在儲存的數據的重要字段和行為。一般來說&#xff0c;每一個模型都映射一個數據庫表。基礎&#xff…

虛擬主機TOMCAT配置

在tomcat中添加虛擬主機&#xff1a;   編輯"tomcat\conf\server.xml"&#xff0c;在"<Engine></Engine>"元素中新加子元素"<Host></Host>"&#xff0c;如下&#xff1a;  </Host>     <Host name&quo…

django框架中表單

參考官方文檔,太詳細了 (https://docs.djangoproject.com/zh-hans/2.1/topics/forms/)

鳥哥學習筆記六(基礎篇第十一章)

type:查看指令是否是bash內建指令 變量的設定規則 1. 變量與變量內容以一個等號『』來連結&#xff0c;如下所示&#xff1a; 『mynameVBird』 2. 等號兩邊不能直接接空格符&#xff0c;如下所示為錯誤&#xff1a; 『myname VBird』或『mynameVBird Tsai』3. 變量名稱只能…

django-models類索引外鍵時候的related_name屬性作用

其實可以就理解為,一對多關系拿對象的解決 可以把引用理解為主從關系 主引用從,即一對多 , 注意外鍵字段是放在多的一端的,比如一個班級class 有很多同學 students,那么就在students類里面設置class字段值是外鍵類型 從students拿class數據很好拿, studet.class就拿到了 但是從…