数据结构基础(1) --Swap & Bubble-Sort & Select-Sort

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;
}

时间: 2024-10-05 15:52:04

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

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

数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取keyword最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次keyword之间的比較, 从n-i+1个记录中选出keyword最小的记录, 并和第i

数据结构基础温故-6.查找(上):基本查找与树表查找

只要你打开电脑,就会涉及到查找技术.如炒股软件中查股票信息.硬盘文件中找照片.在光盘中搜DVD,甚至玩游戏时在内存中查找攻击力.魅力值等数据修改用来作弊等,都要涉及到查找.当然,在互联网上查找信息就更加是家常便饭.查找是计算机应用中最常用的操作之一,也是许多程序中最耗时的一部分,查找方法的优劣对于系统的运行效率影响极大.因此,本篇讨论一些查找方法. 一.顺序查找 1.1 基本思想 顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

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

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

数据结构基础总结

数据的逻辑结构 数据的存储结构 单链表是递归结构 迭代是指从当前元素获得集合中的后继元素. 迭代功能由Tterable可迭代接口和Tterator迭代器接口实现. 栈和队列 是两种特殊的线性表,特殊之处在于插入和删除操作的位置受到限制. 栈:插入和删除只允许在线性表的一端进行,后进先出. 队列:插入和删除分别在线性表的两端进行,先进先出. 数组: 1.数组是随机存取结构,这是数组最大的优点. 2.数组一旦占用一片存储空间,这片存储空间的地址和长度就确定的,不能更改,因此数组只能进行赋值.取值两种

中国大学MOOC-陈越、何钦铭-数据结构基础习题集 03-1. 二分法求多项式单根

03-1. 二分法求多项式单根(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如

翻译:程序员数据结构基础:选择正确的数据结构

本文转载自GameDev.net,仅供学习交流.因为刚刚开始学习翻译,难免有些疏漏,如果有哪些地方翻译的不正确,请不吝告知,万分感谢. 原文链接:http://www.gamedev.net/page/resources/_/technical/general-programming/data-structures-for-pre-college-programmers-choosing-the-right-structure-r2991 网络上的许多初学者还是学生.通常初学者通过在网上看教程,

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio