Swap的简单实现

//C语言方式(by-pointer):
template <typename Type>
bool swapByPointer(Type *pointer1, Type *pointer2)
{
    //确保两个指针不会指向同一个对象
    if (pointer1 == NULL || pointer2 == NULL)
    {
        return false;
    }

    if (pointer1 != pointer2)
    {
        Type tmp = *pointer1;
        *pointer1 = *pointer2;
        *pointer2 = tmp;
    }

    return true;
}

//C++特有方式(by-reference):
template <typename Type>
void swapByReference(Type &value1, Type &value2)
{
    if (value2 != value1)
    {
        Type tmp = value1;
        value1 = value2;
        value2 = tmp;
    }
}

小结:

虽然我们自己实现了swap,但我们还是比较推荐使用C++ STL已经实现好的std::swap()函数,其存在于命名空间std中,使用实例如下面的<冒泡排序>.

冒泡排序(Bubble-Sort)

算法思想:

从左到右扫描数据,找出最大的元素,将其放到数组右边;

过程:

循环比较相邻的两个数,如果左边的数比右边的大,则交换两个数;

//实现:注意代码中的三个注意点(x):
template <typename Type>
void bubbleSort(Type *begin, Type *end)
{
    if ((begin == end) || (begin == NULL) || (end == NULL))
        return ;

    int length = end - begin;
    //注意点(1):保证一旦数组有序, 则会直接停止排序, 不会在继续进行无用的循环
    bool isOrder = false;

    //外层循环控制扫描次数(length-1)
    //注意点(2):N个元素其实只需N-1次扫描
    for (int i = 0; !isOrder && i < length-1; ++i)
    {
        //首先假定这次数组已经有序
        isOrder = true;
        //注意点(3):确保能够从0扫描到最后一个未排序的元素
        for (Type *iter = begin; iter < end-i-1; ++iter)
        {
            //如果前面的左边的元素>右边的元素
            if (*iter > *(iter+1))
            {
                //交换
                std::swap(*iter, *(iter+1));
                isOrder = false;
            }
        }
    }
}

template <typename Type>
void bubbleSort(Type *array, int length)
{
    return bubbleSort(array, array+length);
}

选择排序(Select-Sort)

思想:

从当前尚未排序的序列中选择一个最小的元素, 将之放到已排序的序列的队列的末尾;

要点:

1.注意三个指针(inner, outer, miner)所代表的含义;

2.同时注意是从未排序的序列中进行查找最小元素!

//实现
template <typename Type>
void selectSort(Type *begin, Type *end)
{
    if ((begin == end) || (begin == NULL) || (end == NULL))
        return ;

    //只要循环到最后一个元素的前一个就行了,因为剩下的那个肯定是最大的
    for (Type *outer = begin; outer < end-1; ++outer)
    {
        //注意:是从尚未排序的序列中查找(miner = outer, inner = outer+1)
        Type *miner = outer;
        //从miner+1开始遍历数组, 寻找一个元素值小于*miner的
        for (Type *inner = outer+1; inner < end; ++inner)
        {
            if (*inner < *miner)
                miner = inner;
        }

        if (miner != outer)
            std::swap(*miner, *outer);
    }
}

//为了能够让STL的标准容器如vector使用
template <typename Iterator>
void selectSort(Iterator iter1, Iterator iter2)
{
    return selectSort(&(*iter1), &(*iter2));
}

template <typename Type>
void selectSort(Type *array, int length)
{
    return selectSort(array, array+length);
}

小结:

虽然我们自己实现了Bubble-Sort和Select-Sort,但我们在实际软件开发中一般是不会用到的,因为的它的效率为O(N^2),效率太慢^_^, 因此我们还是推荐使用C++ STL中已经实现了的std::sort(), 其内部原理使用了快速排序, 效率为O(logN)速度非常快.

附-测试程序

int main()
{
    srand(time(NULL));
    vector<double> dVec;
    int count = 10;
    while (count --)
    {
        dVec.push_back((rand()%1000)/100.0);
    }

    selectSort(dVec.begin(), dVec.end());
    for (vector<double>::iterator iter = dVec.begin(); iter < dVec.end(); ++iter)
    {
        cout << *iter << endl;
    }

    return 0;
}

数据结构基础(1) --Swap & Bubble-Sort & Select-Sort的更多相关文章

  1. [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)

    Recently I systematicall review some sorting algorithms, including insertion sort, bubble sort, merg ...

  2. 数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)

    数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601 ...

  3. SDUT OJ 数据结构实验之排序三:bucket sort

    数据结构实验之排序三:bucket sort Time Limit: 250 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem D ...

  4. SDUT 3400 数据结构实验之排序三:bucket sort

    数据结构实验之排序三:bucket sort Time Limit: 150MS Memory Limit: 65536KB Submit Statistic Problem Description ...

  5. SDUT-3400_数据结构实验之排序三:bucket sort

    数据结构实验之排序三:bucket sort Time Limit: 250 ms Memory Limit: 65536 KiB Problem Description 根据人口普查结果,知道目前淄 ...

  6. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  7. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  8. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  9. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

随机推荐

  1. 关于Linux下软件包aptitude的相关操作

    aptitude+回车 - 进入aptitude操作界面,可以对预览查看各种软件包 aptitude show package_name - 列出与XXX相关的软件包信息,但是并不能看到该软件包所安装 ...

  2. ROS新功能包PlotJuggler绘图

    http://www.ros.org/news/2017/01/new-package-plotjuggler.html PlotJuggler,一个基于Qt的应用程序,允许用户加载,搜索和绘图数据. ...

  3. Bootstrap3 表格-基本表格

    为任意 <table> 标签添加 .table 类可以为其赋予基本的样式 - 少量的内补(padding)和水平方向的分隔线.这种方式看起来很多余!?但是我们觉得,表格元素使用的很广泛,如 ...

  4. MySQL系列教程(三)

    mySQL集群(cluster) 这一章,我根本不打算写,因为mySQL 的 官方Cluster方案基本上都是bullshit,尤其是它的官方集群方案,竟然都无人维护了,而且mySQL集群完全可以用眼 ...

  5. Goaccess解析nginx日志备忘

    参考 http://nginx.org/en/docs/http/ngx_http_log_module.html?&_ga=1.92028562.949762386.1481787781#l ...

  6. Android studio 中引用jar的其实是Maven?(一)

    由于Studio比eclipse多了一步对工程构建的步骤,即为build.gradle这个文件运行,因此其引入第三方开发jar包与lib工程对比Eclipse已完成不同,引入第三方jar与lib工程显 ...

  7. CentOS7.2安装Weblogic12c出现的问题

    Weblogic12c安装到步骤:Prerequisite  Checks 时,会进行操作系统版本的校验,即checking  operating  system  certification. 此处 ...

  8. Retrofit,Okhttp对每个Request统一动态添加header和参数(五)

    文/Tamic 地址:http://blog.csdn.net/sk719887916/article/details/52189602 Header How to Add header to Eve ...

  9. Python 继承标准类时发生了什么

    定义标准类dict的一个子类c: >>> class c(dict): pass >>> y=c({1:2,3:4}) >>> y {1: 2, ...

  10. pandas小记:pandas数据输入输出

    http://blog.csdn.net/pipisorry/article/details/52208727 数据输入输出 数据pickling pandas数据pickling比保存和读取csv文 ...