C++学习四 冒泡排序法的一些改进

冒泡排序法需要两次扫描,所以从时间复杂度来说,是O(n2).

如果用图形表示,是这样的:

但是我们可以加以改进。

首先是,如果在排序中间,整个向量已经达到了有序状态,可以直接跳出来。

这样它的复杂度由一个三角形变为一个梯形。

 

 同时,可能存在部分有序的状态,所以可以再次改进:

 

 深蓝色为可能占用的时间复杂度。

我自己写了一个代码测试了一下:

#include<iostream>
#include<vector>
#include <algorithm>//question1: 使用swap()需要包含这个头文件,
using namespace std;

//函数模板,这是冒泡排序的主要过程
template <typename T1> 
T1 bubble(T1 lo, T1 hi,int *x)
{ 
    T1 last=lo;
    while(++lo<hi)
        if(x[lo-1]>x[lo])
        {
            last=lo;
            swap(x[lo-1],x[lo]);//question2:格式是std::swap, 所以如果单独使用
                                          //前面还需要定义using namespace std;
        }
    return last;
}

template <typename T1>//question3:每一个模板函数都需要申明一遍参数
void MySort(int*x, T1 lo, T1 hi )
{ while(lo<(hi=bubble(lo, hi, x))); }


int main(void)
{
    //int x=0;
    //cout<<"the result is "<<x<<endl;
    int p[7]={1,3,5,2,1,7,2};
    int low=0;
    int high=7;
    MySort(p,low,high);
    for(int i=0;i<7;i++)
    cout<<"the result is "<<p[i]<<endl;
    return 0;
}

         

  遇到问题:

1、使用swap()的时候,格式是:

#include <algorithm>
using namespace std;
swap(a,b);

2、使用模板函数的时候,每一个模板函数都需要声明template  <typename T> , 格式如下:

template   <typename T>
T  Mysort(T  a)  //与一般函数用法相同
{
    return 2*a;      
}

3、出错解析:

 这四行加起来是一个错误,编译器只不过在提示。

比如第一句是:在bubble函数的使用中

第二行解释其中是因为Mysort需要使用这个函数

第三行如果我们点击,提示出现在主函数中,是Mysort的使用的地方

第四行是真正的错误,也就是swap函数没有定义

4、运行结果:

 

 上述算法就是sort()排序方法的一种实现原理

参考书籍:

1---《数据结构(C++语言版)》邓俊辉

 

posted @ 2019-10-23 20:24  星光夜  阅读(611)  评论(0)    收藏  举报