排序思路:
1.將陣列分成兩組a,b,建立臨時陣列 c,c長度=a + b
2. i,j分別屬於a,b
3. 若a[i] > b[j] , 將b[j]放入c, j++; 否則 a[i]放入c, i++
4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中
5.遞迴3-4直到a,b序列的長度=1
#歸併排序
class mergesort:
def __init__(self, arrdata):
self.arrdata = arrdata;
self.tmpdata=;
#建立臨時陣列
for i in range(len(self.arrdata)):
return;
#left 要排序的序列的最小索引
#right 要排序的序列的最大索引
def sorthalf(self,arrdata,left,right):
center = (left + right) // 2;
self.mergesort(arrdata,left,center,right);
return;
#排序方法
#[left,center]為第乙個序列
#[center, right]為第二個序列
#兩個序列進行歸併排序
def mergesort(self,arrdata,left,center,right):
##將左邊和右邊遞迴分別分成兩組再進行排序
#直到兩個序列的長度為1後停止遞迴
if left < center :
self.sorthalf(arrdata,left,center);
if center < right:
self.sorthalf(arrdata,center+1,right);
i = left;
j = center + 1;
k = i;
#排序演算法
while k <= right:
#print(i,center,j);
if i > center:
self.tmpdata[k] = arrdata[j];
j = j + 1;
elif j > right:
self.tmpdata[k] = arrdata[i];
i = i + 1;
elif arrdata[i] > arrdata[j]:
self.tmpdata[k] = arrdata[j];
j = j + 1;
else:
self.tmpdata[k] = arrdata[i];
i = i + 1;
k = k + 1;
#複製tmpdata序列到arrdata序列
for l in range(left,right + 1):
arrdata[l] = self.tmpdata[l];
return;
#排序入口
def sort(self):
arrdata = self.arrdata;
left = 0;
right = len(arrdata) - 1;
center = (left + right) // 2;
self.sorthalf(arrdata,left,right);
return;
def __del__(self):
del self.tmpdata;
arr = [7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58];
print(arr);
shellsort = mergesort(arr);
shellsort.sort();
print(arr);
歸併排序的時間複雜度為o(nlog2n),空間效率較差
python歸併排序
coding utf 8 def mergesort seq 遞迴 if len seq 1 return seq mid int len seq 2 left mergesort seq mid right mergesort seq mid return merge left,right def...
Python 歸併排序
歸併排序採用分而治之的方法,遞迴求解。將長度為n的列表分成兩個長度為n 2的子串行 對兩個子串行分別採用歸併排序 將兩個排序好的子串行合併成乙個最終的排序列表 如下 coding utf 8 author dreams file merge sort.py time 2018 7 26 9 29 i...
歸併排序(Python)
歸併排序的核心思想 如果要排序乙個陣列,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,這樣整個陣列就都有序了。歸併排序的執行效率與要排序的原始陣列的有序程度無關,所以其時間複雜度是非常穩定的,不管是最好情況 最壞情況,還是平均情況,時間複雜度都是o nlo...