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

来源:互联网 发布:企业邮箱域名查询 编辑:程序博客网 时间: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个月了,基本上安排的事都做得来,不懂的网上能查,也能问同事,感觉只要是学习了就是在进步,尽管我不是科班出身,尽管我是个文科生。。。

0 0
原创粉丝点击