#464 Sort Integers II

题目描述:

Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(nlogn) algorithm.

Example

Given [3, 2, 1, 4, 5], return [1, 2, 3, 4, 5].

题目思路:

今天喜欢merge sort,就用merge sort好了。需要注意的是,在merge两个sorted array时,需要开辟一个新的array用来存原来的A中start~end的值,否则直接在A上做in-place是会wrongly overwrite的。这个新的array必须是长度为end-start+1的,之前我偷懒直接开了一个A的copy,结果就不能pass lintcode的空间复杂度了。

Mycode(AC = 501ms):

class Solution {
public:
    /**
     * @param A an integer array
     * @return void
     */
    void sortIntegers2(vector<int>& A) {
        // Write your code here
        mergeSort(A, 0, A.size() - 1);
    }
    
    void mergeSort(vector<int>& A, int start, int end) {
        if (start >= end) return;
        
        // sort the left half and right half in A
        mergeSort(A, start, (start + end) / 2);
        mergeSort(A, (start + end) / 2 + 1, end);
        
        // merge the two sorted arrays
        merge(A, start, (start + end) / 2, end);
    }
    
    void merge(vector<int>& A, int start, int mid, int end) {
        // use a tmp array to store A:start ~ end
        vector<int> tmp(end - start + 1, 0);
        int A_idx = start;
        for (int i = 0; i < tmp.size(); i++) {
            tmp[i] = A[A_idx++];
        }
        
        int l = 0, r = mid + 1 - start, idx = start;
        // merge the sorted arrays
        while (l <= mid - start && r < tmp.size()) {
            if (tmp[l] <= tmp[r]) {
                A[idx++] = tmp[l++];
            }
            else {
                A[idx++] = tmp[r++];
            }
        }
        
        while (l <= mid - start) A[idx++] = tmp[l++];
        while (r < tmp.size()) A[idx++] = tmp[r++];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值