看《啊哈!算法》,是很卡哇伊的一本书呀!!!
ps:一下只是个人自述,反思一下。
之前就一直没好好学,想要借着这个寒假好好学习一发,期末考试只能是庆幸没挂,真的感觉超对不起给我高分的班主任,呜呜呜。
在感觉自己无能之前,请先花点时间进去。
寒假暂定任务:
- book 1:啊哈;
- book 2:迈克尔opencv;
- book 3:计组;
【发现前面几天一直在玩,,,什么都没干,哭了,突然感觉东西好多,加油吧。】
【尝试一下每天一篇文章,每天看点我可爱的计组,数电没考好,我要在计组上找回来,,,】
排序算法
- 暂时不去管十大经典排序算法的说法,从简单的开始,完全按照书上的来。
- 书中涉及的几种排序算法
1:桶排序;
2:冒泡排序;
3:快速排序。
简化版的桶排序
题目实例:5位同学,考了5 ,3 ,5 ,2 ,8这几个分数,要求:分数从大到小排序。
【图片源自书的P3】
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
/*简化的桶排序,设置一个长度的数组,
记录相应位数字符出现的次数
*/
int a[11];//桶
int i=0;
int n,m;
cin>>n;
for(int x=0;x<11;x++)
{
a[x]=0;
}
while(i<n)
{
scanf("%d",&m); //数据读入,and出现次数
a[m]++;
i++;
}
for(int x=0;x<11;x++) //print 打印输出
{
cout<<x<<"出现次数为:"<<a[x]<<endl;
}
getchar();//用于暂停程序
return 0;
}
冒泡排序
- 比较两个相邻的元素,不是按自己设想的大小排列的调换顺序。(从小到大or从大到小)
题目:将12 35 99 18 76这几个数字从大到小排序。
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[100];
int n,temp=0;
cin>>n;//n表示数量
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
//n-1趟排序
for(int j=1;j<n;j++)
{
for(int i=1;i<n;i++)
{
if(a[i]>a[i-1])
{
temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
//change
}
}
}
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
getchar();
return 0;
}
- 你还可以弄个结构体,把名字分数对应起来。
快速排序
- 关于快排,这本书上的排序算法似乎有一点点问题,是之前数据结构期末复习看的时候,对照着方法写题目答案对不到这样子的,但是自己也确实说不上来是哪里有问题。
- 推荐一篇复习时看到的博文
https://blog.csdn.net/MoreWindows/article/details/6684558
放一张《啊哈》里面的大图
简单来说,书里面说的就是交换,分块交换这样子。。。
推荐的博文里面的“挖坑”也很容易懂,个人更推荐吧。毕竟用啊哈的写题目有对不上的。
【博文中的具体代码实现】 【可以直接开链接,,,】
#include <iostream>
#include<cstdio>
using namespace std;
int s[100];
int n;
void quick_sort(int l, int r)//表示对应的位置
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j] = s[i];
}
s[i] = x;
quick_sort( l, i - 1); // 递归调用
quick_sort( i + 1, r);
}
}
int main()
{
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
quick_sort(0,n-1);
for(int i=0;i<n;i++)
cout<<s[i]<<" ";
getchar();
return 0;
}
相比于原代码,将if里面的++去了,更好理解一些,感觉也没必要。
其他的问题没考虑,原博下面评论蛮多的,尽可以看。
小哼买书问题
结合桶排序&&冒泡排序。
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[1001];//桶
int num=0;
int n,m;
//n<=100,m:data,
cin>>n;
for(int x=0;x<1001;x++)
a[x]=0;
while(num<n)
{
scanf("%d",&m); //数据读入,and出现次数
a[m]++;
num++;
}
int s[101];
int j=0;
for(int i=0;i<1001;i++)
{
if(a[i]!=0)
{
s[j]=i;
j++;
}
}
//s[0]------s[j]冒泡排序
int temp=0;
for(int p=1;p<j;p++)
{
for(int i=1;i<j;i++)
{
if(s[i]>s[i-1])
{
temp=s[i-1];
s[i-1]=s[i];
s[i]=temp;
//change
}
}
}
for(int i=0;i<j;i++)
cout<<s[i]<<" ";
getchar();
return 0;
}