歸併排序和希爾排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。值得注意的是歸併排序是一種穩定的排序方法。
將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
例如有兩個有序表:(7,10,13,15)和(4,8,19,20),歸併後得到的有序表為:(4,7,8,10,13,15,19,20)。
歸併過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第乙個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;
否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中乙個有序表取完,
然後再將另乙個有序表中剩餘的元素複製到r中從下標k到下標t的單元。
python實現如下。
def merge(l,first,last):
mid = (first+last)/2
i = first
j = mid+1
temp =
while i <= mid and j <= last:
if l[i] < l[j]:
i += 1
else:
j += 1
if i <= mid:
temp.extend(l[i:mid+1])
else:
temp.extend(l[j:last+1])
l[first:last+1] = temp
def mergesort(l,first,last):
if first < last:
mid = (first+last)/2
mergesort(l,first,mid)
mergesort(l,mid+1,last)
merge(l,first,last)
l = [1,4,6,9,2,0,3,8,7,5]
print l
mergesort(l,0,len(l)-1)
print l
希爾排序
希爾排序屬於插入類排序,是將整個有序序列分割成若干小的子串行分別進行插入排序。
排序過程:
先取乙個正整數d1(稱為步長),把所有序號相隔d1的陣列元素放一組,組內進行直接插入排序;
然後取d2直至di=1,即所有記錄放進乙個組中排序為止。
也就是希爾排序是通過由大到小的步長將序列劃分成多個子串行進行直接插入排序,由於在步長較大時,元素可以一次性向前跨越性移動,故在最後一次希爾排序時元素已經基本有序。由此有效降低了比較和交換的次數。
雖然插入排序是穩定的,但是希爾排序卻不是穩定的。其時間效率較難分析,與選取的步長有關。一般希爾排序能達到o(n^3/2)的時間效率。
python實現如下。
def insertsort(l,first,d):
'''insertsort with steplenth of steplenth'''
size = len(l)
i = first
while ifirst:
if key < l[j-d]:
l[j] = l[j-d]
else:
break
j = j-d
l[j] = key
i += d
def shellsort(l,step):
for lenth in step:
for i in range(lenth):
insertsort(l,i,lenth)
print l
l = [1,4,6,9,2,0,3,8,7,5,6]
print l
step = [5,3,1]
shellsort(l,step)
排序演算法 python3
a 8,2,7,5,1,9,6,4,3 point 1 dk len a while true dk dk 2 for n in range dk point dk n while point index 1 for i in range n,point,dk if temp a i index i...
排序演算法筆記 基於Python
插入排序可以分為直接插入排序與分組插入排序 希爾排序 直接插入排序的思想類似於整理撲克牌。當我們拿到一副牌的時候,我們希望由小到大進行排序,一般我們會選擇小的牌插入到大的牌後面完成排序。當然這個過程十分感性,況且有我們強大的視覺功能,第一眼往往就能夠識別出最大的牌和最小的牌。而要讓計算機完成這一操作...
演算法 排序(3)
插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。本節介紹兩種插入排序方法 直接插入排序和希爾排序。直接插入排序基本思想 1 基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r ...