算法学习———某个排序的应用
2014-03-14 16:32
267 查看
由于是一名未经过专业培训的自学型程序猿,对于算法,也不是很清楚到底是干啥。。。工作中用到了某个排序算法,也不知道用的到底是哪个。因而很有必要整理下自己的知识结构,虽然说非专业出身,但一点一点的来慢慢补充知识,也要成为一名合格的程序猿。
首先,了解下啥是冒泡排序吧(因为感觉用的就是冒泡排序。。。),以下引自百度百科:
冒泡排序(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个月了,基本上安排的事都做得来,不懂的网上能查,也能问同事,感觉只要是学习了就是在进步,尽管我不是科班出身,尽管我是个文科生。。。
首先,了解下啥是冒泡排序吧(因为感觉用的就是冒泡排序。。。),以下引自百度百科:
冒泡排序(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个月了,基本上安排的事都做得来,不懂的网上能查,也能问同事,感觉只要是学习了就是在进步,尽管我不是科班出身,尽管我是个文科生。。。
相关文章推荐
- 算法学习———某个排序的应用
- 算法学习之排序(3)--选择排序
- 数据结构排序算法_选择排序算法学习
- 算法学习--希尔和快速排序
- C - Ultra-QuickSort(7.2.2)(7.2应用排序算法编程的实验范例)
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现
- 算法学习之不那么简单的排序(1)
- 从软件工程的角度写机器学习2——流行的机器学习应用模式与算法
- [算法学习笔记]线性时间排序----计数排序
- Java基础学习应用_数组常用方法与排序(一)
- 深度学习算法:SVD分解算法及其应用
- 麻省理工算法导论学习笔记(5)----线性时间排序
- 算法竞赛入门经典:第八章 高效算法设计 8.3归并排序应用之逆序对数
- 算法精讲学习笔记 排序(一)
- OC学习之道:数据结构中几种常见的排序算法:选择排序,插入排序.快速排序
- 基础算法学习(一)__几种排序:选择、插入、冒泡和快排
- 算法学习--选择排序和插入排序
- 数据结构与算法学习笔记之 适合大规模的数据排序
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- 算法学习笔记--排序之快速排序