学完数据结构之后我也只是大致知道了数据结构中都包含什么内容,具体怎么实现和怎么使用并不清楚,所以想一点一点的揭开它背后的真相。
merge函数
注意点:
left>=rigth,如果写成等于将会导致无线递归,栈溢出
void merge(vector<int>& v,int left,int rigth)
{
if (left >=rigth)
return ;
int mid = (left + rigth) / 2;
merge(v, left, mid);
merge(v, mid + 1, rigth);
mergeSort(v,left, mid, rigth);
}
mergeSort函数
注意点:
1:像tmp这类vector如果初始化时没有指定大小,添加元素时要使用push_back(),不然会导致下标越界
2:利用临时数组合并时起始的位置并不一样,因为排序的是V中的left到rigth段(递归过程中有好多个段),所以v数组从left到rigth,而tmp则是从0开始
void mergeSort(vector<int>& v, int left, int mid, int rigth)
{
int i = left, j = mid + 1;
vector<int>tmp;
while (i <= mid && j <= rigth)
{
if (v[i] < v[j])
tmp.push_back(v[i++]);
else tmp.push_back(v[j++]);
}
while (i <= mid) tmp.push_back(v[i++]);
while (j <= rigth) tmp.push_back(v[j++]);
for (int i = 0, j = left; j <= rigth; j++, i++)
v[j] = tmp[i];
}