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
複製代碼