排序思路:
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)): self.tmpData.append(0); 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),空间效率较差