用Python實現基本排序演算法03 插入排序

2021-07-04 22:39:23 字數 1392 閱讀 2232

一、插入排序的思路

回顧前面提到過的氣泡排序、選擇排序,我們發現這兩種演算法的思路還是比較直觀的。然而現在即將隆重推出的插入排序演算法則顯得有些抽象了。

總體而言,插入排序是把待排序的元素全體看成由兩部分組成——已排序完成的部分(有序子串)和尚未排序的部分(無序子串)。

(以從小到大排序為例,假設共計n個元素):

step1. 在一開始,有序子串只包含乙個元素,即第乙個元素(python中記為[0])。

step2.0  從無序子串中取出第乙個元素(這裡為[1]),與有序子串中的元素作比較。

step2.1  從有序子串中最後乙個元素開始比較,若新取出的元素大於有序子串的當前數,則新取出的元素放在當前位置即可,有序子串的長度+1,無序子串的長度-1

step2.2  若新取出的元素小於有序子串的當前數,則有序子串長度+1,並且將有序子串當前數後移一位(同時也就是把當前數的原來位置讓出來了),取出數繼續與有序子串前一位的元素進行比較。

step2.3  重複2.1和2.2,直到將新取的元素放到合適的位置。若有序子串所有元素均大於新取數,則將其放在有序子串的最前面。完成step2之後,有序子串擴充乙個數,但仍保持有序。

step3   重複step2,直到無序子串為空

二、程式例項

用python實現以上思路非常直觀和優雅,下面結合例程中的注釋進一步分析插入排序演算法

#插入排序 的核心思想:

#把排序過程視作乙個不斷增長的排好序的子串

#子串最初只有乙個元素,即原串的第乙個元素。從原串的第二個元素開始,每乙個元素都經過比較

#再插入到合適的位置

#by pospro, 2015-08-29

def insertsort(alist, ord='a'):

if ord=='a': #預設採用公升序排列

n=len(alist) #n為元素數量

for i in range(1,n): # i=(1,2,...n-1) 無序子串從[1]開始直到[n-1],同時有序子串也從[0],增加到[n-2]

newelement=alist[i] #無序子串的第乙個元素,也即待插入的元素

cnt=i #cnt-1恰好指示有序子串的最後一位,也即有序子串中最大的乙個元素

while newelement0: #從後向前比較,直到找到合適的插入位置

alist[cnt]=alist[cnt-1] #如果當前元素比待插入的元素大,則將其後移。空出的位置預備被新元素填入,或者其它元素後移

cnt-=1

alist[cnt]=newelement #迴圈結束時,cnt恰好指示newelement合適的位置

print alist #取消注釋後,可以逐步顯示每個過程

基本排序演算法 Python實現

基本排序演算法,包括氣泡排序,插入排序,選擇排序,堆排序,快速排序等。氣泡排序 複雜度是n n coding utf8 author haxtraz description 氣泡排序 def bubblesort1 a 每次找到乙個最小元素,放到陣列首部 n len a for i in range...

基本排序演算法 Python實現

基本排序演算法,包括氣泡排序,插入排序,選擇排序,堆排序,快速排序等。氣泡排序 複雜度是n n coding utf8 author haxtraz description 氣泡排序 def bubblesort1 a 每次找到乙個最小元素,放到陣列首部 n len a for i in range...

用python實現基本的排序

氣泡排序 def sort alist for j in range len alist 1 for i in range len alist 1 j if alist i alist i 1 alist i alist i 1 alist i 1 alist i return alist 選擇排序...