归并排序

来源:互联网 发布:webassembly 知乎 编辑:程序博客网 时间:2024/05/16 11:49

归并排序,复杂度O(nlgn)。
思路是每次将数组分成两部分,然后对各部分进行排序,通过合并(归并)操作将两段已经排序过的数组进行整合,形成新的排序数组的顺序。

void merge(vector<int>& nums, int left, int mid, int right){    vector<int> L(nums.begin() + left, nums.begin() + mid+1);    vector<int> R(nums.begin() + mid + 1, nums.begin() + right+1);    L.push_back(INT_MAX);    R.push_back(INT_MAX);    int i = 0;    int j = 0;    for (int k = left; k <= right; k++){        if (L[i] <= R[j])            nums[k] = L[i++];        else            nums[k] = R[j++];    }}void merge_sort(vector<int>& nums, int left, int right){    if (left < right){        int mid = (left + right) / 2;        merge_sort(nums, left, mid);        merge_sort(nums, mid + 1, right);        merge(nums, left, mid, right);    }}int main(){    srand(time(0));    vector<int> nums(10);    for (int i = 0; i < nums.size(); i++){        nums[i] = rand() % 20;    }    for (auto val : nums)        cout << val << " ";    cout << endl;    merge_sort(nums, 0, nums.size() - 1);    cout << "merge-sort: " << endl;    for (auto val : nums)        cout << val << " ";    cout << endl;    return 0;}

运行结果如图:
归并排序图示

0 0
原创粉丝点击