none
这是我写的“冒泡”,测试过了,求指点可以改进的地方 RRS feed

  • 问题

  • 代码如下

    void main()
    {
    	int a[8],i,j,k;
    	cout<<"请输入8个整数"<<endl;
    	for(i=0;i<=7;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=0;i<=7;i++)
    	{
    		for(j=1;j+i<8;j++)
    		{
    			if(a[i]<a[i+j])
    			{
    				k=a[i];
    				a[i]=a[i+j];
    				a[i+j]=k;
    			}
    		}
    	}
    	for(i=0;i<=7;i++)
    	{
    		cout<<a[i]<<" ";
    	}
    
    

    2011年6月19日 7:03

答案

  • 您可以参考这个文章,希望对您有帮助:
    http://www.cublog.cn/u/15807/showart_102891.html
    http://www.cppblog.com/fdsajhg/archive/2010/08/14/123440.html
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年6月27日 8:52
    2011年6月23日 0:36
    版主
  • 你好,

     

    您可以考虑增加几个变量以处理特殊情况。例如您可以设置一个变量,当本轮排序没有进行数据交换,则可以认为已经排序成功。 这个可以在一定程度上减少排序时间。

    增加 n_exchange, n_head ,记录最近的交换位置,下轮排序只要冒到该位置即可。

     

    这个是我的参考代码希望对您有所帮助

    #include <stdio.h>

    #include <stdlib.h>

     

    int poposort(int *polist, int n)

    {

        int i, j;

        int n_exchange;

        if (NULL == polist)

            return 0;

        n_exchange = 0;

        for (i = 0; i < n - 1; i++)

        {

            /* 最外层循环,冒泡排序需要比较n-1 */

            int b_exchange;

            int n_head;

            b_exchange = 0;

            n_head = n_exchange;

            for (j = n - 1; j >= n_head + 1; j--)

            {

                /* i 轮比较,把最轻的泡冒置第i 个位置*/

                if (polist[j] < polist[j - 1])

                {

                    int n_tmp_num;

                    n_tmp_num = polist[j];

                    polist[j] = polist[j - 1];

                    polist[j - 1] = n_tmp_num;

                    b_exchange = 1;

                    n_exchange = j;

                } /* end-if */

            } /* end-for */

            /* 若第i 轮冒泡结束,并没有交换数据,则表示已经排序完成*/

            if (0 == b_exchange)

                return 1;

        } /* end-for */

        return 1;

    }

     

    int main()

    {

        int polist[10] = {45,12,43,11,32,34,91,58,20,82};

        /*int polist[10]  =

        {

            0, 1, 2, 3, 4, 5, 6, 7, 9, 8

        };*/

        (void) poposort(polist, 10);

        return 0;

    }

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年6月27日 8:52
    2011年6月23日 2:30

全部回复

  • 挺好的,向nlogn挺进。。。

     


    麻烦把正确答案设为解答。
    2011年6月20日 8:42
    版主
  • 您可以参考这个文章,希望对您有帮助:
    http://www.cublog.cn/u/15807/showart_102891.html
    http://www.cppblog.com/fdsajhg/archive/2010/08/14/123440.html
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年6月27日 8:52
    2011年6月23日 0:36
    版主
  • 你好,

     

    您可以考虑增加几个变量以处理特殊情况。例如您可以设置一个变量,当本轮排序没有进行数据交换,则可以认为已经排序成功。 这个可以在一定程度上减少排序时间。

    增加 n_exchange, n_head ,记录最近的交换位置,下轮排序只要冒到该位置即可。

     

    这个是我的参考代码希望对您有所帮助

    #include <stdio.h>

    #include <stdlib.h>

     

    int poposort(int *polist, int n)

    {

        int i, j;

        int n_exchange;

        if (NULL == polist)

            return 0;

        n_exchange = 0;

        for (i = 0; i < n - 1; i++)

        {

            /* 最外层循环,冒泡排序需要比较n-1 */

            int b_exchange;

            int n_head;

            b_exchange = 0;

            n_head = n_exchange;

            for (j = n - 1; j >= n_head + 1; j--)

            {

                /* i 轮比较,把最轻的泡冒置第i 个位置*/

                if (polist[j] < polist[j - 1])

                {

                    int n_tmp_num;

                    n_tmp_num = polist[j];

                    polist[j] = polist[j - 1];

                    polist[j - 1] = n_tmp_num;

                    b_exchange = 1;

                    n_exchange = j;

                } /* end-if */

            } /* end-for */

            /* 若第i 轮冒泡结束,并没有交换数据,则表示已经排序完成*/

            if (0 == b_exchange)

                return 1;

        } /* end-for */

        return 1;

    }

     

    int main()

    {

        int polist[10] = {45,12,43,11,32,34,91,58,20,82};

        /*int polist[10]  =

        {

            0, 1, 2, 3, 4, 5, 6, 7, 9, 8

        };*/

        (void) poposort(polist, 10);

        return 0;

    }

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年6月27日 8:52
    2011年6月23日 2:30