python歸併排序 python 歸併排序

2021-10-19 21:29:25 字數 1962 閱讀 1513

排序思路:

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...