算法学习———某个排序的应用
来源:互联网 发布:企业邮箱域名查询 编辑:程序博客网 时间:2024/06/11 08:46
由于是一名未经过专业培训的自学型程序猿,对于算法,也不是很清楚到底是干啥。。。工作中用到了某个排序算法,也不知道用的到底是哪个。因而很有必要整理下自己的知识结构,虽然说非专业出身,但一点一点的来慢慢补充知识,也要成为一名合格的程序猿。
首先,了解下啥是冒泡排序吧(因为感觉用的就是冒泡排序。。。),以下引自百度百科:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。由于冒泡排序简洁的特点,它通常被用来对于计算机程序设计入门的学生介绍算法的概念。冒泡排序算法的运作如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
一段C的示例代码
voidbublle_sort(int a[],int n)//n为数组a的元素个数 { int i,j,temp; for(j=0;j<n-1;j++) { for(i=0;i<n-1-j;i++) { if(a[i]>a[i+1])//数组元素大小按升序排列 { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } } }
这个算法简洁的特点,所以是入门介绍的。。。所以我不知不觉的应用这个算法用的最多。。。
工作上用到的排序需求:(C++语言)
1.排序的对象是一个vector容器,容器的成员类型是一个结构体;
2.排序需求是根据容器成员的不同属性对整个vector容器进行排序,如:
(1)按vector所有成员的A属性进行升降序排列,这里的需求是按升序排,具体的说是:成员的A属性的属性值范围为0-9,值为0的排最后,值为1到9的按升序排,即,假如有10个成员,他们的A属性值分别为:0,1,5,3,4,0,2,0,6,0;那么要的顺序是:1,2,3,4,5,6,0,0,0,0;
(2)按vector所有成员中有B属性进行排序,这里A属性和B属性是不相容的,即有A属性就不会有B属性。具体说就是:以0和1作为判断成员是否有B属性,假如有另外10个成员,他们的B属性值分别为:0,1,1,0,1,1,0,1,0,1;那么要的做的就是把值为1的放最后:0,0,0,0,1,1,1,1,1,1;
(3)同(2),另一个C属性。
(4)最后的顺序要求是,A属性值不为0的成员排最前面,而B属性值或C属性值不为0的排最后。
3.此外,2中提到的数据是不固定的,即,A、B、C属性值不为0的成员数未知。
具体操作:
1、先要确定A属性值不为0的成员的数量:
为了得到所有成员中A属性值不为0的成员数量,首先我用两个for循环语句将所有成员中A属性值不为0排列到最前面:
for (int i = 0; i<vector_test.size(); ++i) { for (int j = 0; j<=i; ++j) { if (vector_test[i].a) { A temp = vector_test[i]; vector_test[i] = vector_test[j]; vector_test[j] = temp; } } }
这样操作之后,所有成员中A属性值不为0的都会到最前的位置,此时这些值还是为排序的。然后以num来确定这些成员的数量:
int num = 0; for (int i = 0; i<vector_test.size(); ++i) { if (vector_test[i].a) { ++num; } }
因为已经将A属性值不为0的成员排列到最前,所以只需要从vector的0下标位置开始遍历vector,成员A属性不为0则增加一个数量。得到这个数量出于两个目的:第一,如果这个数量不为0,那么就是知道vector中有成员的A属性值不为0;第二,为之后的B、C属性排序做准备,使对其排序的时候可以跳过num个成员。得到了数量之后那么就开始对A属性值不为0的成员进行值升序排序。
if (num) { for (int i = 0; i<num-1; ++i) { for (int j = num -1; j>=i; --j) { if (vector_test[i].a>vector_test[j].a) { ABC temp = vector_test[i]; vector_test[i] = vector_test[j]; vector_test[j] = temp; } } } }
首先我判断了num的数量,因为num假如为0了,那么后面的排序就会出错,vector_test[-1]是。。。(暴露了,不知道该怎么描述了。。。)因为之前我已经把成员中A属性值不为0的成员排列到了vector的最前的位置,然后又确定了这些成员的数量,所以这个时候我只需要对vector的前num个成员进行排序了,这里应该说是用到了冒泡排序了吧。。。,从下标0开始,总共要循环num-1次,两个for循环保证能够遍历到前num个成员中的每一个。这里我发现问题了,之前的冒泡排序中,比较的时候是第二个for循环中的变量i和i+1进行比较,这样应该才是真正的全部遍历到了吧?而我这里用的是第一个for循环中的变量i和第二个for循环中的变量j进行比较,感觉还是有点问题,还需要进一步了解这个冒泡排序。不过实际用的时候这样排出来的是有效的。。。。这样处理之后,就把A属性值不为0的成员排列到了最前,并且做了升序排列。
接着就对其余有B或C属性的成员进行处理了:
for (int i=num; i<vector_test.size(); ++i) { for (int j=vector_test.size()-1; j>=i; --j) { if (vector_test[i].b) { ABC temp=vector_test[i]; vector_test[i]=vector_test[j]; vector_test[j]=temp; } if (vector_test[i].c) { ABC temp=vector_test[i]; vector_test[i]=vector_test[j]; vector_test[j]=temp; } } }因为之前已经确定了A属性值不为0的成员的数量,所以现在对B、C属性值不为0的成员排序的时候,就要跳过前num个,排完之后,B、C属性值不为0的成员位于最后,同为B属性的在一起,同为C属性的在一起。嘿嘿。。。
出于算法知识的匮乏,我把我这个有点乱的排序归为冒泡排序了。。。这样做完之后达到了要求的效果。
小总结,算法知识匮乏的很,应该说是没有任何可以算得上计算机用到的排序概念,做上面的那个排序折腾了好久,没有规律的,感觉是在摸着走,一步一步试着做的,所以很没有效率。所以,为了提高自己的工作效率,这方面的知识要不断的补充。
有的时候自己也感觉挺惭愧的,非科班出身,却干着计算机相关的工作,很多知识不懂,却还要工作。也许就出于自己的一份兴趣吧,差不多是从去年年初的时候自己学习计算机C/C++语言的,没有报什么培训班,就是自己看书,然后做做题写写代码,有时间看博客。后来转做游戏,用Cocos2dx引擎写,东西写的出来,就是感觉自己会走弯路,有的时候跟同事交流用的语言不规范,都有点不好意思。。。总之,慢慢学吧,工作5个月了,基本上安排的事都做得来,不懂的网上能查,也能问同事,感觉只要是学习了就是在进步,尽管我不是科班出身,尽管我是个文科生。。。
- 算法学习———某个排序的应用
- 数组排序 —— 堆排序算法的应用(小范围排序、重复值判断)
- 排序算法学习——快速排序
- 算法学习—排序总结
- 算法学习—排序篇
- [算法学习笔记]排序算法——堆排序
- 算法学习之排序算法的C++实现——冒泡排序
- 排序算法的应用
- 算法——求某个数的质因数
- 【排序算法】图解算法——用眼睛学习算法
- 算法学习——不交换的选择排序
- 插入排序算法学习——算法导论学习笔记
- 常见的排序算法—冒泡排序
- 经典算法学习——冒泡排序
- 经典算法学习——快速排序
- 经典算法学习——堆排序
- 经典算法学习——希尔排序
- 经典算法学习——归并排序
- mysql启动错误1067的解决
- myeclipse中的工程修改名字后,在Tomcat的deploy location中的修改
- python 自动生成100万ip列表
- git
- C++使用VS2008同时使用在共享DLL中使用MFC和公共语言运行时支持(/clr)出现的问题
- 算法学习———某个排序的应用
- 网页界面设计 使网页更吸引用户的窍门
- C++ 解析XML
- IOS XMPP 带内注册用户
- 自定义运行命令
- CSS浏览器兼容问题
- APPLE推送通知服务教程 PART-2
- STL内存分配器:allocator
- 几种树形菜单