优化版冒泡排序

冒泡排序:属于贪心的一种,即短视,只看到自己周围,和相邻的元素进行比较,根据从小到大或从大到小的规则进行交换排列。
一般的冒泡,采用两重for循环

for (int j = 0; j < length; j++)  //冒泡排序
    {
        for (int k = 0; k<length - j - 1; k++)
        {
            if (c[k]>c[k + 1])
            {
                int temp = c[k];
                c[k] = c[k + 1];
                c[k + 1] = temp;
            }
        }
    }

即用第一层中的j来控制第二层中的循环次数——每一次循环排好最后一个值后,下一次就可以不用再对它进行排序,所以每次都会减1。

在这个的基础上,输入的数据可能是部分有序,即并不是完全的乱序,或者是在排序过程中,有一部分的顺序不需要进行改变,那么这一部分的比较就是不必要的。

思路:设置一个临时值,把最后发生交换的位置传给临时值,之后只要将最小的位置和这个临时值进行比较,而不是每次都按部就班减1。好处是,可以跳过最后一次交换位置后有序部分的数据,免去无意义的比较。

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;

void bubble(int *p, int lo, int hi)
{
    
    int last = lo;           //设置一个位,作为最后发生交换的位置
    for (int i = lo; i < hi; )
    {
        last = lo;        //将last重置,作为终止条件
        for (int j = lo; j < hi; ++j)
        {
            if (p[j] >p[j + 1])
            {
                last = j ;      //每当发生交换,就更新last的值
                swap(p[j], p[j + 1]);
                
            }
        }
        hi = last;
    }
}




int _tmain(int argc, _TCHAR* argv[])
{
    time_t begin, end;
    begin = clock();
    int buf[] = { 1, 2, 8, 4, 55, 77, 99, 45, 76, 35, 78, 96, 13, 56, 78, 90, 76, 45, 78 };
    int length = sizeof(buf) / sizeof(int);
    bubble(buf, 0, length-1);
    for (int s : buf)
    {
        cout << s << endl;
    }
    end = clock();
    cout << "runtime: " << double(end - begin) / CLOCKS_PER_SEC << endl;
    return 0;
}

输入的数据量越大,两者花费时间差距越明显。
1466148-20190103105843068-772910161.png

转载于:https://www.cnblogs.com/ymd12103410/p/10213050.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值