整数排序II-lintcode

来源:互联网 发布:零基础网络美术培训班 编辑:程序博客网 时间:2024/06/06 09:51

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

先添加一个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
原创粉丝点击