def mergeLR(self,start,mid,end,data):
i=0
j=0
k=start
# python3 语法 range(start,mid+1) mid+1无法返回
l=[ data[v] for v in range(start,mid+1) ]
r=[ data[v] for v in range(mid+1,end+1) ]
while i<len(l) and j<len(r):
if l[i] >= r[j]:
data[k]=r[j]
k+=1
j+=1
else:
data[k]=l[i]
i+=1
k+=1
for li in range(i,len(l)):
data[k]=l[li]
k+=1
for rj in range(j,len(r)):
data[k]=r[rj]
k+=1
# end 取值 如果给的是数组的长度,那么在merge的时候需要区分左侧merge和右侧merge end是否可以取得到# 1分隔到最小的单元再合并# 2合并左侧取到中间值,右侧则不获取
def subMerge(self,start,end,data):
if start != end :
mid = (end+start) // 2
self.subMerge(start,mid,data)
self.subMerge(mid+1,end,data)
self.mergeLR(start,mid,end,data)
复制代码
private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)//当父节点大于子节点的时候停止
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}
复制代码
注意它的本身不是线程安全的,线程安全的实现为PriorityBlockingQueue
至此可以得到。堆排的时间是O(nlgn)
Count Sort
将要排序的每一个数映射到一个数组的下标,然后按照顺序输出数组的值即可
def sort(self):
k=self.maxValue+1
L=[[] for i in range(k)] //创建大小为k的数组
n=len(self.data)
for j in range(n):
# 保证原有的相同元素顺序不会更改 计算下标
L[self.data[j]].append(self.data[j])
print(L)
output=[]
for i in range(k):
output.extend(L[i])
print(output)
复制代码
def sort(self):
for i in range(1,self.maxDigit+1):
self.__countSort(i)
def __countSort(self,n,b=10):
"""b代表进制,比如10进制,说明,最大数字是10,使用count sort解决"""
L=[[] for i in range(b)]
for x in range(len(self.data)):
v=self.data[x]
vn=self.significantIntDigit(n,v) //获取对应位数
L[vn].append(self.data[x])
print(L)
self.data=[]
for i in range(b):
self.data.extend(L[i])
def significantIntDigit(self,n,value):
"""
处理10进制
int类型直接使用,与str相比不需要len
"""return(value // 10 **(n-1))%10
复制代码