C++修炼笔记----------利用合并排序提升排序效率(分而治之---Divide-Conquer )
2010-04-16 15:07
375 查看
最近在看算法导论,看到了分而治之这一块。将排序的性能提升到n*log(n)。
反正刚好在熟悉C++,就拿来实现一下吧。
看到后面有个思考题,求一个数组的逆序数。提示用分而治之的思想。
个人觉得在 将Merge里面的else 加上一行 count += n1 - i + 1; 就可以了。
几百年没碰过C++了。当时纠结了C++的数组长度不能是变量,list,vector又不能直接赋值。迷茫中请教了一下同学。原来先申请一个足够大的数组就可以了。真的要变成小白了。
反正刚好在熟悉C++,就拿来实现一下吧。
#include <string> #include <iostream> #include <vector> using namespace std; void Merge(int a[],int p, int q, int r) { int n1 = q - p + 1; int n2 = r -q; int ary_l[10]; int ary_r[10]; for (int i = 0;i<n1;i++) { ary_l[i] = a[p+i]; } for (int j = 0;j<n2;j++) { ary_r[j] = a[q+1+j]; } int i = 0; int j = 0; ary_l[n1] = ary_r[n2] = 100; for (int k = p; k<=r;k++ ) { if (ary_l[i] <= ary_r[j]) { a[k] = ary_l[i]; i = i + 1; } else { a[k] = ary_r[j]; j = j +1; } } } void Merge_sort(int ary[] ,int p , int r) { int q = (p+r)/2; if (p < r) { Merge_sort(ary,p,q); Merge_sort(ary,q+1,r); Merge(ary,p,q,r); } } int main() { int a[8]; for (int i = 0;i<8;i++) { cin>>a[i]; } int te=0; Merge_sort(a,0,7); cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]; cin>>te; return 0; }
看到后面有个思考题,求一个数组的逆序数。提示用分而治之的思想。
个人觉得在 将Merge里面的else 加上一行 count += n1 - i + 1; 就可以了。
几百年没碰过C++了。当时纠结了C++的数组长度不能是变量,list,vector又不能直接赋值。迷茫中请教了一下同学。原来先申请一个足够大的数组就可以了。真的要变成小白了。
相关文章推荐
- 【算法】分而治之(DivideAndConquer) -- C++源代码(VS2015)
- C++利用指针数组和快排对输入的字符串进行排序
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- 为C++的map翻案,map实际是排序并且迭代效率不低的
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- leetcode_c++:Divide and Conquer: The Skyline Problem(218)
- leetcode_c++:Divide and Conquer:Count of Smaller Numbers After Self(315)
- .net中利用oracle产品自带的数据访问组件(Oracle.DataAccess.dll)提升批量更新操作的执行效率
- 合并两个排序链表 - C++
- SQL效率提升之一些SQL编写建议并有效利用索引
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- 分治法--用C++实现合并排序
- c++学习笔记:直接排序
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- 算法导论学习笔记之二--分而治之(divide-and-conquer approach)
- 算法学习笔记--5.merge sort & divide-and-conquer
- 插入排序, 合并排序, 快速排序C++源代码
- 合并两个排序的链表(C++版)
- 利用NSCache提升效率
- C++利用stl::sort对结构体数组中的字符串成员排序