由于最近要找工作,所以频繁刷题,算法题中,排序算法用的比较多,我看过非常多的排序算法,突然需要自己实现的时候,感觉并不是很熟练,有时候细节部分也记得不太清楚,因此,对于常考的算法题,自己记录下来,以便以后不懂的时候能迅速再看明白。
思路
关于归并排序,其主要思路是,对一个数组按照一个位置(一般是中点)将数组划分成两个部分,并依次对两个部分继续同样的操作,即继续对按照一个点进行二分,直至每个小部分剩下1~2个数据,然后对小块数据进行排序,然后依次合并、排序、合并、排序……
这种可以用递归来实现,递归的是二分,向上是合并+排序。关于二分,不需要真的分成两块,只需要记录其两块的起止指针即可。其排序过程是建立一个同样大小的数组,对两块数组(已排序好),两个指针分别指向其初始位置,依次比较选择其较大(小)的数据,然后提取数据之后的指针后移,即依次遍历两块数据,把较大数据依次填充到新数组中,这样就完成小块数组的合并+排序,最后的数组就是都排好序了的。
归并排序是个稳定的算法,其时间复杂度为nlog(n)。
后续有时间会继续补充……
代码
#归并排序
def mergesort(arr,l,mid,r):
aux = []
for i in arr:
aux.append(i)
i = l
j = mid+1
for k in range(l,r+1):
if j>r:
arr[k] = aux[i]
i += 1
elif i>mid:
arr[k] = aux[j]
j += 1
elif aux[i] < aux[j]:
arr[k] = aux[i]
i += 1
else:
arr[k] = aux[j]
j += 1
return arr
def merge(arr,l,r):
if r<=l:
return arr
mid = int((l+r)/2)
arr = merge(arr,l,mid)
arr = merge(arr,mid+1,r)
arr = mergesort(arr,l,mid,r)
return arr
arrs = [1,4,3,2,4,9,5,3,354,5,4,56,6,3]
print(merge(arrs,0,len(arrs)-1))
#调试
arrs = [1,4,3,2,4,9,5,3,354,5,4,56,6,3]
print(merge(arrs,0,len(arrs)-1))
#输出
[1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 9, 56, 354]