算法熟记-排序系列-归并排序
2011-06-08 14:05
543 查看
1. 简述
假设待排序数组为 int array[], 数组长度为n。归并排序是一个递归得方法。
当n==1时,停止递归。
当n>1时,开辟一个与array同样大小得数组,int tmp[]
将array[0]-array[n/2]得数组递归排序,将array[n/2+1]-array[n-1]的数组递归排序
将两部分数组,分别用两个指针,将小得元素一个一个放入到tmp数组中。
将tmp复制到array中,然后,释放tmp数组。
2. 复杂度
平均时间复杂度为O(N*LogN),空间复杂度为O(N)。
稳定性是稳定得排序,注意程序中,两个指针在比较得时候,如果大小相同,应该把第一个指针得数据放到tmp中,就能保证是稳定得排序了。
3. 代码
void merge_sort(int array[], int n) {
// 递归终止
if(n <= 1)
return;
// 递归排序
merge_sort(array, n/2);
merge_sort(array+n/2, n-n/2);
// 合并操作
int *tmp = new int
;
int a = 0;
int b = n/2;
int i = 0;
while(a < n/2 && b<(n-n/2)) {
if(array[a] <= array[b]) // 这里得<=保证了稳定性
tmp[i++] = array[a++];
else
tmp[i++] = array[b++];
}
while(a < n/2) {
tmp[i++] = array[a++];
}
while(tmp[i++] = array[a++]) {
tmp[i++] = array[b++];
}
for(i=0; i<n; i++)
array[i] = tmp[i];
delete []tmp;
}
其中,最后得两个while和一个for语句中得复制,可以使用memcpy加快速度。
4. 参考资料
维基百科-归并排序 http://en.wikipedia.org/wiki/Merge_sort
假设待排序数组为 int array[], 数组长度为n。归并排序是一个递归得方法。
当n==1时,停止递归。
当n>1时,开辟一个与array同样大小得数组,int tmp[]
将array[0]-array[n/2]得数组递归排序,将array[n/2+1]-array[n-1]的数组递归排序
将两部分数组,分别用两个指针,将小得元素一个一个放入到tmp数组中。
将tmp复制到array中,然后,释放tmp数组。
2. 复杂度
平均时间复杂度为O(N*LogN),空间复杂度为O(N)。
稳定性是稳定得排序,注意程序中,两个指针在比较得时候,如果大小相同,应该把第一个指针得数据放到tmp中,就能保证是稳定得排序了。
3. 代码
void merge_sort(int array[], int n) {
// 递归终止
if(n <= 1)
return;
// 递归排序
merge_sort(array, n/2);
merge_sort(array+n/2, n-n/2);
// 合并操作
int *tmp = new int
;
int a = 0;
int b = n/2;
int i = 0;
while(a < n/2 && b<(n-n/2)) {
if(array[a] <= array[b]) // 这里得<=保证了稳定性
tmp[i++] = array[a++];
else
tmp[i++] = array[b++];
}
while(a < n/2) {
tmp[i++] = array[a++];
}
while(tmp[i++] = array[a++]) {
tmp[i++] = array[b++];
}
for(i=0; i<n; i++)
array[i] = tmp[i];
delete []tmp;
}
其中,最后得两个while和一个for语句中得复制,可以使用memcpy加快速度。
4. 参考资料
维基百科-归并排序 http://en.wikipedia.org/wiki/Merge_sort
相关文章推荐
- 算法熟记-排序系列-插入排序
- 算法熟记-排序系列-堆排序
- 算法熟记-排序系列-选择排序
- 傻瓜学算法系列之排序——4.归并排序
- 算法熟记-排序系列-希尔排序
- 算法熟记-排序系列-计数排序
- 算法熟记-排序系列-快速排序
- 算法熟记-排序系列-基数排序
- 每天学习算法系列—内部排序之归并排序和快速排序
- 排序系列算法——归并排序
- 算法熟记-排序系列-冒泡排序
- 白话经典算法系列之六 高速排序 高速搞定
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之六 快速排序 快速搞定
- 算法系列之-栈实现栈的排序
- 白话经典算法系列之六 高速排序 高速搞定
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 【排序】排序算法之归并排序
- 算法原理系列:木桶排序