排序算法总结2
归并排序
今天我们来谈一下归并排序,归并排序对于初学者可能有一定的难度,因为它需要用到递归的思想。如果你对递归十分熟练的话,那么会对你理解归并排序有很大的帮助。
举个例子,6,2,1,4,3,5。对这个数组进行从大到小的排序。这时我们可以想一下,我们是否可以让左边三个数字先有序,也就是变成1,2,6.然后让右边三个数字有序,变成3,4,5。这样我们让这两个数组进行比较,如果小的先出列,然后比较下一项。最终获得结果,可是我们如何让左边的数组有序呢?那就是将左边数组再分一半,再按照上述套路进行排序,就这样层层递归下去,最终左侧的数组排好序,开始递归右边的数组。
如果不熟悉的同学可以画一下递归图,这样会让你对过程有清晰的认识。归并排序的时间复杂度为O(nlogn),额外空间为O(n).
下边我们看一下code
//归并排序
class Solution1
{
public:
static vector<int> help;
void mergesort(int l, int r, vector<int>& arr)
{
if (l == r)
return;
else
{
int mid = l + ((r - l) >> 1);
mergesort(l, mid, arr);
mergesort(mid + 1, r, arr);
int left = l, right = mid+1,k=l;
while (left <= mid && right <= r)
{
if (arr[left] <= arr[right])
help[k++] = arr[left++];
else
help[k++] = arr[right++];
}
while (left <= mid)
help[k++] = arr[left++];
while (right <= r)
help[k++] = arr[right++];
for (int i = l; i <= r; i++)
arr[i] = help[i];
}
}
void MergeSort(vector<int>& arr)
{
int n = arr.size();
help.resize(n);
mergesort(0, n-1, arr);
}
};
vector<int>Solution1::help;
明天我会讲解快速排序的内容 ,如果这篇博客对你有用的话,请各位看官帮忙点点赞。
1745

被折叠的 条评论
为什么被折叠?



