简单排序算法整理及体会
来源:互联网 发布:淘宝包邮退货邮费规则 编辑:程序博客网 时间:2024/06/05 15:38
以下主要是在看《啊哈!算法》时,看到的一些简单排序算法,整理一下,免得又忘了。
因为代码是自己写的,没有经过任何测试。。。
1.桶排序:好吧,这里是阉割版的简单桶排序,估计是为了让读者建立信心吧,因为从代码上来看,原来这么容易。先上代码:
int a[5] = { 6, 8, 2, 9, 4}; int book[10]; for (int i = 0; i < 10; i++) { book[i] = 0; } for (int i = 0; i < 5; i++) { int j = a[i]; book[j]++; } for (int i = 0; i < 10; i++) { if (book[i] != 0) { cout << i << endl; } }
一说到排序,第一反应就是在数组的基础上,把最小的排左边啊,然后第二小的啊,看了桶排序,真真切切的感觉到,原来电脑的空间上很大的,偶尔申请几个数组,真的无所谓,合理区间内,该用就用。
2.冒泡排序:基本上说排序的第一反应了,原来也是一个整理好的算法,先上代码:
int a[5] = {2, 5, 8, 9, 10}; for (int i = 5; i > 0; i--) { for (int j = 1; j < i; j++) { if (a[j-1] < a[j]) { int nTmp = a[j]; a[j] = a[j-1]; a[j-1] = nTmp; } } for (int j = 0; j < 5; j++) { cout << a[j] << " "; } cout << endl; } cout << "结果" << endl; for (int j = 0; j < 5; j++) { cout << a[j] << " "; } cout << endl;
冒泡排序这个算法,可以说对我来讲是记忆犹新的一个算法了。对,没错,面试的时候,无耻的碰上了,然后,崩溃的写垮了!!随着工作时间久了,发现自己当时真的太无知了。不要说算法了,直到最开始上班的时候,才知道有一个大名鼎鼎的mfc!!原来,窗口跟控制台,只差一个MFC。不过说到无知,貌似记得刚毕业去面试的时候,更无知,面试官问了半天问题,结果我用一句话都怼回去了“我不会,但是我肯定没问题!”,“呵呵”。
3.快速排序:太出名了,第一次看到快速排序的示例动态图时,真的是,太高端了,太炫了,下面是个人写的:
void QuickSort(int* arg, int nBegin, int nEnd){ if (nBegin > nEnd) { return; } int nIndex = nBegin; int nLast = nEnd; int nTmp = arg[nBegin]; while (nBegin != nEnd) { if (arg[nEnd] >= nTmp) { nEnd--; continue; } if (arg[nBegin] <= nTmp) { nBegin++; continue; } int x = arg[nEnd]; arg[nEnd] = arg[nBegin]; arg[nBegin] = x; } arg[nIndex] = arg[nEnd]; arg[nEnd] = nTmp; for (int j = 0; j < 10; j++) { cout << arg[j] << " "; } cout << endl; QuickSort(arg, nIndex, nBegin-1); QuickSort(arg, nBegin+1, nLast);}
一直觉得,常用的这些代码,应该靠理解来记忆,但是,像快速排序这种的,我只能说:背下来!递归哦,终于看到活的递归了。
4.深度优先搜索(DFS):终于逃出了饶来绕去的算法了,把深度优先搜索和前面的排序算法一比:我总是有一种面相对象和面向过程对比的感觉,我觉得,这是思考上的改变,嗯,根本性的,上代码:
void dfs(int step){if (step == n+1){for (int i = 1; i <= n; ++i){cout << a[i] << " ";}cout << endl;}for (int i = 1; i <= n; ++i){if (book[i] == 0){a[step] = i;book[i]++;dfs(step+1);book[i]--;}}return;}深度优先搜索:主要的思维逻辑就是:a.什么时候结束b.当前步骤干什么 c.下一步重复
至于与深度优先搜索同步的广度优先搜索(BFS),也主要是利用了类似层序遍历的方式进行的,用一个队列,各种插入各种取出。我没写,就不贴了。
5.寻找多数元素(主元素问题):数组中,某个数是超过50%的,找出来。
这个主要的原理是:如果一个数组,有某数超过50%,那么从数组中,随便拿出来2个不一样的数字,那么剩下的数组,超过50%的,肯定还是原来那个。不会变的,因为是拿出来了2个不一样的数字!!
曾经也各种鄙视过,面试的时候,问这些破算法有什么用,业务代码毛用没有,但是随着工作期间各种遭遇,愈发觉得,算法与数据结构,的确是程序的灵魂,在理解的基础上,能背就背下来吧……就好比最简单的swap(int& a, int&b ),之前每次都要想一下,具体怎么操作才能互换,后来,直接背下来了,时间是有限的,节省一点是一点啊!
最后要吐槽一下《啊哈》,里面的数组都是从1开始算起,对于习惯了从0开始的人,有时候,真有点乱!
- 简单排序算法整理及体会
- 算法整理:排序算法简单整理
- 算法~快速排序~体会
- 简单排序算法整理(冒泡,选择,插入)
- 简单的排序算法整理(一)
- 数据结构排序算法及代码整理
- 简单选择排序的体会
- 排序算法的分类及简单比较
- 简单数据结构总结及常用排序算法
- 排序算法汇总及简单实现
- 排序简单整理
- 经典算法体会之冒泡排序
- 排序算法整理
- 排序算法整理
- 排序算法整理
- 整理几个排序算法
- 排序算法整理
- 排序算法整理
- dfs生成排列组合模板
- Ubuntu 16.04搭建LAMP开发环境
- 读Android经典系列一-Android编程权威指南-第三版英文版:全书大纲
- sublime text3插件安装方法
- 如何快速转载CSDN中的博客
- 简单排序算法整理及体会
- python beautifulsoap的安装
- 虚拟机参数总结
- css 竖直居中
- 【3.9】
- 20条LINUX常用命令
- poj3414
- 框架模式笔记:MVC 与MVP框架(完)
- CentOS下安装mysql