归并排序
今天种树的任务-归并排序。。改一个小bug改了一个多小时。?
算法介绍
https://www.cnblogs.com/chengxiao/p/6194356.html
嗯嗯,有图
原理非常好理解:分治递归+合并有序数组。我看完算法介绍的第一行就知道这是个什么东西了。
归并排序的优点:
- 稳定,不会破坏原来的顺序。
- 效率高,O(nlogn)。并且最好最坏平均都是O(nlogn)。
查阅资料的时候,我还看到一个博客说对原本小范围数据有序队列效率更好。。。?我想他大概说的是某种归并排序的优化算法吧。反正基础的归并排序没有这个特点。
C++实现
#include <iostream>
#include <stack>
#include <time.h>
#include <stdlib.h>
using namespace std;
int arrs[] = { 23, 476, 65, 12, 3, 925, 8, 98, 76, 345, 90, 21, 762, 75, 34, 123, 61 };
int length = sizeof(arrs) / sizeof(arrs[0]);
void MergeSort(int* istart, int* iend, int* tmp)
{
if(istart == iend)
return;
//分成两半排序
int* divide = (iend - istart) / 2 + istart;
MergeSort(istart, divide, tmp);
MergeSort(divide + 1, iend, tmp);
//合并有序数组
int* p1 = istart;
int* p2 = divide + 1;
int* k = tmp;
while(p1 <= divide || p2 <= iend)
{
if(p1 <= divide && (p2 > iend || *p1 >= *p2))
{
*k = *p1;
p1++;
}
else
{
*k = *p2;
p2++;
}
k++;
}
//拷贝到原来的空间
for(int* i = istart; i <= iend; i++)
*i = *(tmp + (i - istart));
return;
}
int main()
{
int *tmp = (int*)malloc(sizeof(arrs));
MergeSort(arrs, arrs + length - 1, tmp);
for(int i = 0;i<length;i++)
cout<<arrs[i]<<" ";
free(tmp);
return 0;
}
我要提高效率呀,写代码太慢了,种树+5