菜鸟的算法日常
来源:互联网 发布:淘宝店铺首页怎么设置 编辑:程序博客网 时间:2024/05/17 02:32
1、快速排序
方法:选择数组中的一个数,将数组中比它小的数放在它的左边,数组中比它大的数放在它的右边,然后递归(而这样的方法有很多,这里仅是总体思想)
举个栗子:挖坑填坑法(这名字绝逼不是我取的)
先上代码:
int a[10];
void sort_(int m,int n)
{
if(m>=n) return;
//递归条件。注意这里的>=是因为若所取的数为a[m]时,递归则会去取m到m-1为范围
int i=m, j=n,t;
t = a[i];
while (i != j)
{
for (;a[j] > t&&j>i;j--);
a[i] = a[j];
if(i!=j)
{
for (;a[i] <= t&&i<j;i++);
a[j] = a[i];
}
}
a[i] = t;
sort_(m, i-1);
//递归的取值范围必须是所取数的下标+1/-1到最大/最小,否则会死循环
sort_(i+1, n);
}//本快排由律爷特约修改播出
2、归并排序
方法:(其实是分治法的具体体现)先将数组近乎平等地分成两份,两份各自分别排序,再将左右两数组的元素从第一个开始比较,小的则取出存进新数组,大的继续和另一个数组的下一个元素比较,最后将新数组复制到原数组,递归完成。
直接上代码:
int A[10],T[10];//在自定义函数里的定义数组容易出现未知错误,所以尽量开全局数组
void merge_sort(int A[], int x,int y,int T[])
{
if (y - x > 1)
{
int m = x + (y - x) / 2;
//相比与(x+y)/2,这里的优势在于向0取整,即正数时两式相同,负数时(x+y)/2会向小 的一方取整
int p = x, q = m, i = x;
merge_sort(A, x, m, T);
merge_sort(A, m, y, T);
while (p < m || q < y)
{
if (q >= y || (p < m&&A[p] <= A[q]))
//后面一个条件不可省略其中的p<m,否则即使一个数组的数已经比较完毕,依然会 在新书组中存入已比较完毕的数组的最后一个元素
T[i++] = A[p++];
else
//((q<y && A[p]>A[q]) || p>=m)
T[i++] = A[q++];
}
for (i = x;i < y;i++)
A[i] = T[i];
}
}
//至于两种算法对于相同数组元素的排序的影响应该不大,没二分查找那么麻烦
- 菜鸟的算法日常
- 菜鸟的日常总结
- 某自称菜鸟的日常笔记(3)
- 大二菜鸟接触算法,特开博客记录日常学习。
- 菜鸟日常记载【1】
- 菜鸟的日常安卓简单之路(1)
- 穆年小菜鸟的日常随记——socket+php聊天室
- 算法日常
- 日常算法
- 高手的算法与菜鸟的用户
- 一个菜鸟的java求字谜算法
- 菜鸟都能理解的KMP算法
- Android菜鸟笔记-Fragment日常使用记录
- 日常整理算法笔记
- 菜鸟学算法----改进后的欧几里得算法
- 穆年小菜鸟的日常随记——XML文件写入一个文件里面(适用所有的文件)
- 日常常用小算法----1
- 菜鸟笔记之算法
- 山东省第四届蓝桥杯 ///标题: 马虎的算式//c/c++组
- Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)
- 医院业务系统设计(一) --- 开篇
- 山东省第四届蓝桥杯 ///题目标题: 第39级台阶//c/c++组
- Plus One
- 菜鸟的算法日常
- 比赛之后的心情
- 反转句子的单词顺序
- 基于linux-2.6.38.8内核的SDIO/wifi驱动分析
- linux下面搭建apache+php+mysql环境
- Hdu 2096之解题报告
- 山东省第四届蓝桥杯 ///题目标题:前缀判断//c/c++组
- 推送通知(远程推送)
- [细说Java](1)图说字符串的不变性