1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| ''' 非递归的归并排序算法 Merge1 决定了次排序是稳定的排序。 归并排序算法 需要一个等大小的空间, 而且需要来来回回倒来倒去, 所以,实际应用中,不被用于内排序,而被用于外排序!!!!
每两个相邻的元素归并,形成新元素组, 每两个相邻的新元素组 归并,形成新新元素组, ... 重复直到归并成一个完整的元素组。 用下面的图表示过程: # 这一共的深度为logN - - - - - - - - # - 代表 当前有序子序列。一行到下一行的过程就是merge_pass。 -- -- -- -- ---- ---- --------
递归的方向是从"整到分", 非递归的方向是从"分到整"。 '''
def Merge_pass(A,temp_A,N,length): if length < N/2: for i in range(0,N-2*length,2*length): print('i=',i) Merge1(A,temp_A,i,i+length,i+2*length-1) print('到包括i的倒数第二个位置已经处理完毕 i=',i) i += 2*length print('i进入最后的子序列对,或者单独子序列。i=',i) if i + length <= N-1: print('偶') Merge1(A,temp_A,i,i+length,N-1) else: print('奇') for j in range(i,N): temp_A[j] = A[j] global tag tag = i else: i = tag Merge1(A,temp_A,0,i,N-1)
def Merge_Sort(A): N = len(A) length = 1 temp_A = A.copy() if temp_A != None: while length < N: print('1') Merge_pass(A,temp_A,N,length) length *= 2 print('2') Merge_pass(temp_A,A,N,length) length *= 2 else: return "空间不足"
def Merge1(A,TmpA,L,R,RightEnd): LeftEnd = R - 1 Tmp = L NumElements = RightEnd - L + 1 while L <= LeftEnd and R <= RightEnd: if A[L] < A[R]: TmpA[Tmp] = A[L] L += 1 else: TmpA[Tmp] = A[R] R += 1 Tmp += 1 while L <= LeftEnd: TmpA[Tmp] = A[L] Tmp += 1 L += 1 while R <= RightEnd: TmpA[Tmp] = A[R] Tmp += 1 R += 1
if __name__ == '__main__': A = [3,1,9,8,28,36,44,35,0,100] temp_A = A.copy() N = len(A) length = 1 print('length=',length) Merge_pass(A, temp_A, N, length) print(temp_A) length = 2 print('length=', length) Merge_pass( temp_A,A, N, length) print(A) length = 4 print('length=', length) Merge_pass(A,temp_A, N, length) print(temp_A) length = 8 print('length=', length) Merge_pass(temp_A,A, N, length) print(A) length = 16 print('length=', length) Merge_pass(A,temp_A, N, length) print(temp_A,'最终结果。')
Merge_Sort(A) print(A,'最终结果。')
|