您的位置:首页 > 其它

算法学习———某个排序的应用

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个月了,基本上安排的事都做得来,不懂的网上能查,也能问同事,感觉只要是学习了就是在进步,尽管我不是科班出身,尽管我是个文科生。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 排序算法