整数排序II-lintcode

这种题目就是按照《算法导论》的来就行。

先添加一个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);
}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值