ACCP8.0为高中生量身定制,免费提供职业规划
嘉华职业教育东莞校区是一所经国家教育局批准设立的正规培训学校,...
学什么有钱途,互联网+时代这些行业紧缺IT人
金蛛微信营销 带你实战营销圈 90天实战从零基础到专业大咖
2022双十一狂欢
java课程
web大前端
选学校,选专业,就选北大青鸟
语法是语言的特色,而算法却是灵魂
算法不分语言
入门的算法要数排序算法
今天的算法讲解将以c语言为例子将以下几个排序算法
1. 桶排序
2. 插入排序
3. 冒泡排序
4. 快速排序
首先给大家介绍一个最简单粗暴的排序算法
桶排序
桶排序要先知道要排序的数的范围
然后要这么多的桶去装这些可能出现数的次数
//这里的范围是0~999
int b[1000];
这个数组就是用来装出现次数的
然后输入数字,然后这个相应的桶的次数就加1
输出时遍历全部桶,然后桶的数字是几就输出几次这个数字
代码如下
#include
int main(){
int num;
//弄一个大桶装所有可能出现的数,用来记录每个数字出现的次数,桶的个数是可能出现的最大值
int b[1000]={0};
int i,j;
for(i=0;i<10;i++){
scanf("%d",&num);
//该数字出现次数+1
b[num]++;
}
for(i=0;i<1000;i++){
//桶有装有几个数就输出几次
for(j=0;
这方法够简单够粗暴吧
其实这方法还可以优化一下
我们虽然是知道范围,但输入的数的范围可能要比给出的范围少得多,这样的话遍历全部桶就很浪费时间了
所以我们可以找到输入数字的最大值和最小值,只需遍历最大值和最小值之间的桶就行了,因为其他桶都是0,不用输出所以代码就可以改为
#include
int main(){
int num;
//弄一个大桶装所有可能出现的数,用来记录每个数字出现的次数,桶的个数是可能出现的最大值
int b[1000]={0};
int max=0;
int min=1000;
int i,j;
for(i=0;i<10;i++){
scanf("%d",&num);
//该数字出现次数+1
b[num]++;
/ 到最大值,后面输出可以节省时间,最大值后面的桶都是0,也可以再找最小值,最小值前面的桶都是0
if(num>max){
max=num;
}
if(num
桶的编码对应的是它记录的数字然后有人就问如果有负数怎么办负数的话,把全部桶平移一下就好,输出时把桶的编码再减去平移值
比如范围是-10~9
可以开个数组int b[20];
输入的话就是b[num+10]++
输出的话printf(“%d “,i-10);
这个算法大概就是这样了,虽然说是简单,但是我们通常情况下是不知道确切的范围的,如果以最大范围去开辟桶就会很浪费空间然后接下来讲第二种算法插入排序插入排序的基本思想是,从第二个数开始,插入到前面有序序列的位置
比如说3个数,分别是5,4,2
然后从第二个数开始
4比5小,应该插到5的前面
然后5后退一位
现在的序列编程4,5,2然后到第三个数2
2应该插到4前面
所以4和5都要后退一位
现在就变成2,4,5的有序序列了具体代码是这样#include
int main(){
int a[1000];
int b;
int i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
//还可以在输入的时候就排序了
}
for(i=1;i<10;i++){
int temp=a[i];
int n=i-1;
//跟前面的比较,小的话就向前,并且该位向后移动一位
while(n>-1&&temp第二个for循环i=1就是从第二个数开始可能需要大家一点抽象思维去想象比如排队
是按号排队的
他迟到了
然后他就拿这号从最后一位一直向前问
后面的都比他大,终于找到一个比他小的
他不可能排他前面,所以只能排他后面
然后他就插队进去了
他后面的人都被他挤后了一位接下来介绍另一种排序算法冒泡排序冒泡排序的思想是,每次把最小的数冒到左边
就像气泡一样越接近水面的泡泡越大
继续是以刚刚的数列5,4,2为例
从第一个数开始
5比4大,然后就交换
4比2大然后就交换
然后现在的序列是2,5,4
然后到第二个数开始
5比4大,交换位置
然后这个序列就排好了具体代码如下#include
int main(){
int a[1000];
int i,j,temp;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(i=0;i<9;i++){
//跟后面的所有数进行比较,大的就交换
for(j=i+1;j<10;j++){
//交换
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
} 这种排序方法是初学者必须掌握的一种排序方法最后讲一种高级一点的算法快速排序掌握这种方法可以说是初学者的分水岭这种排序方法包含了递归和分治的思想递归我们最熟悉的就是猴子吃桃最后一天剩一个,每天吃总数的一半,吃了五天,然后问你最开始有多少个桃子然后就是从最后一天开始算,一直算到第一天分治就是,讲一个问题分开处理但分开处理是没有影响的就比如扫地可以扫地分为扫客厅和扫房间快速排序的思想是从给一个数组,然后在数组中找一个基准值两边派一个士兵去帮我找数要从右边的士兵开始右边的士兵要找一个比基准值小的数找到后停下来等左边的士兵左边的士兵要找一个比基准值大的数找到后就停下来,交换这两个数的位置交换后继续找,直到他们相遇相遇时这个数一定比基准值小大家直到为啥吗我们有一个很关键的一步从右边开始右边停下的位置一定是小于基准值的相遇后相遇的数和基准值交换,我们这里取最左边的数为基准值交换之后,基准值的左边都是比基准值小的,基准值右边都是比基准值大的然后就按相同的规则排基准值的左边和右边排序时不仅要传入数组,还要传入范围一旦排到左边界等于右边了就不用排了,就可以return返回了代码如下#include
int main(){
int a[1000];
int i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
quicksort(a,0,9);
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
void quicksort(int a[],int left,int right){
if(left>=right){
return;
}
int low=left;
int high=right;
//这个基准值可以随便取,只要在left和right范围内就好
int key=a[left];
while(low!=high){
//顺序很重要,要先从右边开始找
//因为最后交换时左边的要都比基准小
//右边大于基准值就跳过
while(low=key){
high--;
}
//左边小于基准值就跳过
while(low如果大家理解了这种算法,对c语言的造诣就会深一层
这篇关于快速排序博客有配图更加形象这里讲的都是从小到大的排序,大家可以思考一下用这几种算法如何从大到小排序
北大青鸟东莞金码学校是北大青鸟APTECH在东莞唯一的授权中心,拥有软件开发工程师、网络工程师、安卓工程师、学士后Java工程师、学士后 NET工程师、网络营销师、电子商务师、启蒙星等课程授课资质。
有很多的学生都有问过这样一个问题,说零基础能学电脑吗?我什么都不会,对电脑一点都不熟悉,我可以学习电脑吗?我可以这么回答你们,零基础是可以学电脑的,而且不用担心学不会,关键是在于你找了一个怎么样的培训学校,北大青鸟东莞金码学校就是一个针对课程针对是零起点的学校。
人们为了改变现状,追求自己的幸福生活,越来越多的人都选择了拼搏。那么在拼搏的路上是否真能实现自己的目标,很关键的一步便在于最初的选择,那你需要有一技之长的技术,那么在这个社会,现在学什么技术工资高,就业不用愁呢?那肯定是 学一门好的电脑专业了,高薪资,好就业,前景广阔,提升空间大。要满足这些条件的技术工作,数IT行业最合了!
初级程序员程序员软件工程师网络工程师高级网络工程师网络安全与高级应用工程师OSTA软件工程师OSTA网络工程师OSTA Java工程师
北大青鸟东莞金码学校为学生提供住宿条件,干净的楼房,有专人管理打扫,安静环境氛围好,学生可根据意愿选择是否在校住宿。
时间过得真快,转眼间就要毕业了。接下来就要为找工作而烦恼,在之前我们学院为我们的毕业准备了几次职业规划讲座,主要是为我们毕业生作一
公司新员工自我介绍的方法:该介绍姓名、年龄、籍贯,主要经历。尽量简练、明了,不能罗嗦。态度要诚恳,最后说:希望大家多关照。公司新员
很多学生求职难,不是因为素质不好、能力不行、经验不够被刷掉,而是因为简历不够闪!找出写简历的突破口、切入点,才能在HR的筛选过程中脱
面试是整个应聘过程中最重要、最直接的环节,相比于测评、笔试、背景调查等环节,面试是候选人与雇主直接面对面交流的机会,把握住面试机会
一些职业限制因素是我们无法掌控的。新产品发布有可能被经济不景气拖累,你的导师在公司重组中失业,你必须在高层另找个新的获胜者作为导师
1、javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符;2、目的分类:字符串运算符;逻辑运算符;逐位运算符;赋
用PHP过滤html里可能被利用来引入外部危险内容的代码。有些时候,需要让用户提交html内容,以便丰富用户发布的信息,当然,有些可能造成显...
每个Android应用都需要一个名为AndroidManifest xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下。
面试Javascript工程师难吗?Javascript工程师的水平参差不齐,如何评定他们技术水平的高低?如何确定Javascript工程师适合承担哪方面的任务?...
无论你是经验丰富的专业Android开发者,还是初出茅庐的新人,开发应用最忌讳的就是闭门造车。不能把自己圈在自己的思维里,要学会借助外在
7月11日下午 Y2T09班举行模拟面试活动。本次模拟面试的主要目的是让学员们真切感受到求职面试的实况,使学员能根据社会的需求和自身的特长...
东莞哪里学网络营销好?网上论坛、贴吧、问答平台上总能见到一些网友提出这样一类问题。可见大家在选择网络营销培训学校的时候比较在意口碑
经过一个多星期的努力奋斗,5月15日上午九点整S1T107班HTML网页设计大赛正式拉开序幕,此次比赛邀请到了潘校长、王老师、学术部朱老师和李
高中毕业考不上大学很多人第一想到的便是复读,复读这对于学生来说显然需要顶着巨大的压力,而且一年的时间提升分数也很有限;
近几年,上大学能不能改变孩子命运这个话题,已成为社会各界人士议论的焦点。虽说上大学是改变孩子命运的一种方式,但这并不是肯定的,更不