算法学习2
来源:互联网 发布:淘宝休闲裤背景素材 编辑:程序博客网 时间:2024/06/10 13:08
分治三步骤:
分解:将原问题分解为若干个模块较小,相互独立,与原问题形式相同的子问题。
解决:把规模较小容易被解决的直接解,否则递归解各个子问题。
合并:将子问题的解合并为原问题的解。
参考
中国大学MOOC - 算法基础
话歪之地的博客
1 归并排序
数组排序任务可以如下完成:
1) 把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
// -------- 代码实现归并排序 ---------#include<iostream> using namespace std; int a[10]={5,7,9,1,8,4,6,10,3,2}, b[10]; //将数组a的局部a[s,m]和a[m+1,e]合并到temp,并保证temp有序,然后再拷贝回a[s,m] // 归并时间复杂度:O(e-m+1),即O(n)void Merge(int a[], int s, int m, int e, int temp[]){ int pb=0; // 指向临时数组 int p1=s, p2=m+1; // 分别指向前一半和后一半数组 while(p1<=m && p2<=e){ if(a[p2] < a[p1]) temp[pb++] = a[p2++]; else temp[pb++] = a[p1++]; } while(p1<=m) temp[pb++] = a[p1++]; while(p2<=e) temp[pb++] = a[p2++]; for(int i=0; i<pb; i++){ a[s+i] = temp[i]; } } //对数组a,将a[s]到a[e]归并排序 void MergeSort(int a[], int s, int e, int temp[]){ if(s < e){ int m = s +(e-s)/2; MergeSort(a,s,m,temp); // 前一半排序 MergeSort(a,m+1,e,temp);// 后一半排序 Merge(a,s,m,e,temp); // 合并 } } int main(){ int length = sizeof(a)/sizeof(int); // 需要排序的元素个数 MergeSort(a,0,length-1,b); // 归并函数 for(int i=0;i<length;i++) cout<<a[i]<<' '; return 0; }
归并排序的时间复杂度
对n个元素进行排序的时间
一直做到
复杂度
2 快速排序
数组排序任务可以如下:
1)设k = a[0],将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边。(O(n)时间完成)
2)把k左边的部分快速排序
3)把k右边的部分快速排序
#include<iostream> using namespace std; //对数组a,从a[s]到a[e]进行快排 void QuickSort(int a[], int s, int e){ if(s >= e) return; int key = a[s]; int left = s, right = e; while(left != right){ while(left<right && a[right]>=key) //从右往左找到比key小的 right--; a[left] = a[right]; while(left<right && a[left]<=key) //从左到右找到比key大的 left++; a[right] = a[left]; } a[left] = key; //此时left和right相等 QuickSort(a,s,left-1); QuickSort(a,left+1,e); } int main(){ int a[]={5,7,9,1,8,4,6,10,3,2}; int length = sizeof(a)/sizeof(int); QuickSort(a,0,length-1); for(int i=0;i<length;i++) cout<<a[i]<<' '; return 0; }
3 棋盘覆盖
棋盘覆盖问题分析(附代码)
阅读全文
0 0
- 算法学习2:KNN 算法
- 算法学习笔记(2)
- 算法导论学习2
- 算法学习--数据结构2
- 算法导论2学习
- STL算法学习2
- 2阶段算法学习 。。
- 算法学习-2
- 算法学习 2
- 算法学习-2
- 算法学习2
- 每日学习一算法【2】A*算法
- 算法学习-2-2韩信点兵
- 算法导论学习笔记-2
- 如何学习算法 (2)
- 算法学习之路2
- 算法导论2学习整理
- 妙趣横生的算法学习2
- 教育思想研究----爱因斯坦论教育
- 【前端面试】前端面试题300道~~熬夜吐血整理
- sscanf类似于正则表达式的进阶用法
- 背包九讲——01背包(降维+常数级优化)
- Java基础学习之Java基本语法(2)【变量的分类】
- 算法学习2
- Codeforces Round #439 (Div. 2) C. The Intriguing Obsession 组合数学
- hibernate 基本
- 过滤器
- 第四周 项目 3
- JavaWeb中的9个隐式对象
- 前缀索引
- java设计模式---单例设计模式
- c++指针类型int *和int(*)[5]的区别