这种题目就是按照《算法导论》的来就行。
先添加一个python的归并排序,一开始只能通过95%的数据,后来按照《算法导论》归并后的第一个习题改了一下,可以全部通过,但是时间还是挺长。
归并排序-python代码:
class Solution:
# @param {int[]} A an integer array
# @return nothing
def sortIntegers2(self, A):
if len(A) <=1:
return
len1 = len(A)
p = len1/2
self.mergeSort(A,0,len1-1)
def merge(self,A,p,q,r):
n1 = q-p+1
n2 = r-q
L = []
R = []
for i in range(n1):
L.append(A[i+p])
for i in range(n2):
R.append(A[i+q+1])
L.append(999999999)
R.append(999999999)
i=0
j=0
for k in range(n1 + n2):
if L[i] <= R[j]:
A[p+k] = L[i]
i += 1
if i == len(L):
A[p+k+1:n1 + n2] = R[j:n2]
else:
A[p+k] = R[j]
j+=1
if j == len(R):
A[p+k+1:n1+n2] = L[i:n1]
def mergeSort(self,A,p,r):
if p < r:
q = (p+r)/2
self.mergeSort(A,p,q)
self.mergeSort(A,q+1,r)
self.merge(A,p,q,r)
C++代码:
class Solution {
public:
/**
* @param A an integer array
* @return void
*/
void sortIntegers2(vector<int>& A) {
int len = A.size();
mergeSort(A,0,len-1);
}
void merge(vector<int> &A, int p, int q, int r){
vector<int> left,right;
int len1=q-p+1;
int len2 = r-q;
for(int i=0; i<len1; i++){
left.push_back(A[p+i]);
}
for(int i=0; i<len2; i++){
right.push_back(A[q+1+i]);
}
int i=0,j=0;
while(i<len1 && j<len2){
if(left[i] < right[j]){
A[p+i+j] = left[i];
i++;
}else{
A[p+i+j] = right[j];
j++;
}
}
for(;i<len1;i++){
A[p+i+j] = left[i];
}
for(; j<len2; j++){
A[p+i+j] = right[j];
}
}
void mergeSort(vector<int> &A,int p,int r){
if (p >= r) {
return;
}
int q = (p+r)/2;
mergeSort(A,p,q);
mergeSort(A,q+1,r);
merge(A,p,q,r);
}
};