归并排序
Posted olajennings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
归并排序的步骤如下:
思想:将数组分成两部分,两部分都是有序的时候,把两个数组合并。合并的方法就是双指针,i 指向左边的数组,j 指向右边的数组,比较 L[i] 和 R[j] 的大小,将其填入原数组,并且将 i 或 j 往后移。
步骤:
1.将数组分成两部分,直到其中只包含一个元素
2.当数组只包含一个元素的时候,递归返回上一层,此时数组包含两个元素,左数组一个,右数组一个,将左右数组合并。
#include <iostream> #include <vector> using namespace std; void merge(vector<int>& arr, int l, int m, int r){ int n1 = m-l+1; int n2 = r-m; vector<int> L; vector<int> R; for(int i = 0; i < n1; i++) L.push_back(arr[l+i]); for(int j = 0; j < n2; j++) R.push_back(arr[m+1+j]); int i = 0; int j = 0; int k = l; while(i < n1 && j < n2){ if(L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while(i < n1) arr[k++] = L[i++]; while(j < n2) arr[k++] = R[j++]; } void mergeSort(vector<int>& arr, int l, int r){ if(l < r){ int m = l+(r-l)/2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } } int main(){ vector<int> arr = {38}; mergeSort(arr, 0, arr.size()-1); return 0; }
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章