排序(插入排序)

來源:互聯網
上載者:User

標籤:name   排序   rand   條件   希爾   判斷   而且   邊界條件   exe   

演算法有很多種分類,我們一種一種來,先來看看插入排序,插入排序的意思是在拿到一個新的數前,之前的序列已經排好,現在的任務就是找到這個新的數字在序列中的位置,這就需要一個個去比較,直到找到一個位置滿足要求。插入排序又分為兩類。

1、直接插入排序,直接插入排序,名副其實,從序列的第二個數開始,依次與前面已經排列好的數值進行比較,如果發現它比前面的數值都大,則其當前所在位置就是正確位置,否則就要將一系列數值往後遷移一格,直到找到一個數值比它小,那麼這個位元值後邊那個位置就是當前數值應該在的位置。可以看到直接插入排序在原序列上進行變動,不需要開闢新空間,但是每次加入一個數字時都需要頻繁的進行比較和移動,因此這個開銷肯定不小,基本上就是n的平方了。

2、shell排序,這種排序起始是變相的直接插入排序,在直接插入排序中,我們是以步長為1進行排序的,如果我們以不同的步長進行排列,而每次依次減小,直到變為1.

現在給出python代碼。

#coding:utf-8

#插入排序,每次排序時都假設當前索引處的數字之前所有的數都已經排好
#用當前數與前面的數進行比較,找到其所在位置,相應數進行移動。
def insertSort(numList):
length = len(numList)
for i in range(1,length):
if numList[i] < numList[i - 1]:
temp = numList[i]
j = i - 1
while j >= 0:
if numList[j] > temp:
numList[j + 1] = numList[j]
j -= 1
else:
numList[j + 1] = temp
break
if numList[0] > temp:#注意邊界條件,可能當前數比原始排好的序列的第一個數的都小
numList[0] = temp

#希爾排序,主要是在插入排序的基礎上,不是每次以1為步長,而是先從一個比較大的步長開始,間隔進行插入排序,
#每排完一個步長,步長相應減小,繼續排序,直到步長變為1
def shellSort(numList):
step = [7,5,3,1]
lengthen = len(numList)
for i in range(0,lengthen):
try:
shellInsert(numList,step[i])
except IndexError,e:
pass
def shellInsert(numList,dk):
lengthen = len(numList)
for k in range(0,dk):
for i in range(k + dk,lengthen,dk):
try:
if numList[i] < numList[i - dk]:
temp = numList[i]
j = i - dk
while j >= 0:
if numList[j] > temp:
numList[j + dk] = numList[j]
j -= dk
else:
numList[j + dk] = temp
break
if numList[k] > temp:#注意這裡的邊界條件,是要一直到當前序列的第一個數,因此必須是k而不能是0或者其它。
numList[k] = temp
except IndexError,e: #主要是有可能會發生越界,為了省去在代碼中麻煩的越界判斷,直接給個越界報錯。
pass

def test():
import copy,random
a = []
for i in range(100):
temp = random.randint(0, 100)
while True:
for x in range(len(a)):
if a[x] == temp: #這裡主要是防止了有重複元素出現,也可以免去這一步,直接往數組填隨機數,而且這樣似乎更合理
temp = random.randint(0, 100)
break
else:
a.append(temp)
break
# a.append(random.randint(0,100))
for item in a:
print item,
print ‘\n‘
b = copy.deepcopy(a)
insertSort(a)
shellSort(b)
for x in a:
print x,
print ‘\n‘
for x in b:
print x,

if __name__ == ‘__main__‘:
test()

排序(插入排序)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.