数据结构基础(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;
}
数据结构基础(1) --Swap & Bubble-Sort & Select-Sort的更多相关文章
- [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)
Recently I systematicall review some sorting algorithms, including insertion sort, bubble sort, merg ...
- 数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)
数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601 ...
- SDUT OJ 数据结构实验之排序三:bucket sort
数据结构实验之排序三:bucket sort Time Limit: 250 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem D ...
- SDUT 3400 数据结构实验之排序三:bucket sort
数据结构实验之排序三:bucket sort Time Limit: 150MS Memory Limit: 65536KB Submit Statistic Problem Description ...
- SDUT-3400_数据结构实验之排序三:bucket sort
数据结构实验之排序三:bucket sort Time Limit: 250 ms Memory Limit: 65536 KiB Problem Description 根据人口普查结果,知道目前淄 ...
- 算法与数据结构基础 - 双指针(Two Pointers)
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
随机推荐
- [多线程] 生产者消费者模型的BOOST实现
说明 如果 使用过程中有BUG 一定要告诉我:在下面留言或者给我邮件(sawpara at 126 dot com) 使用boost::thread库来实现生产者消费者模型中的缓冲区! 仓库内最多可以 ...
- 20160213.CCPP体系详解(0023天)
程序片段(01):全排列.c 内容概要:全排列密码库 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <std ...
- Spark:聚类算法
Spark:聚类算法 Kmeans聚类 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇 ...
- argparse库 学习记录
初始化 始见参数 name or flags action nargs default type choices required help dest metavar 总结 继上次的optparser ...
- ejabberd mod_echo 解析
ejabberd mod_echo 解析(金庆的专栏 2016.8)按开发入门的说明,mod_echo是最简单的模块之一.https://docs.ejabberd.im/developer/当然 m ...
- EBS开发性能优化之查找需要优化的程序
1.登陆数据库LINUX环境 使用 top 命令查看进程状况 [oratest@ebsdb~]$top top - 15:58:59 up 8 days, 22:04, 1 user, load ...
- SQL Server 执行计划操作符详解(1)——断言(Assert)
前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使--把执行计划发出来看看.当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙.根据本人经验,大量的性能问题单纯从语句来看很 ...
- Java基本语法-----java二维数组
由于word里的样式在csdn上调太麻烦了,所以我再次贴图了,后面二维数组那里是文字的,大家将就看吧. 二维数组常见的操作: 1.遍历二维数组 2.对二维数组求和 class Demo { // 定义 ...
- 【并发编程】Binder运行机制的流程图
Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存.从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用 ...
- 财务模块多组织,GL, SLA, SOB, COA, BSV, CCID, LE 概念的简单介绍
GL= General Ledger 指的是Oracle 的总帐系统. application_id = 101. 在uk似乎居然还有不同的解释(In the UK, it was refer ...