Swap的简单实现

  1. //C语言方式(by-pointer):
  2. template <typename Type>
  3. bool swapByPointer(Type *pointer1, Type *pointer2)
  4. {
  5. //确保两个指针不会指向同一个对象
  6. if (pointer1 == NULL || pointer2 == NULL)
  7. {
  8. return false;
  9. }
  10.  
  11. if (pointer1 != pointer2)
  12. {
  13. Type tmp = *pointer1;
  14. *pointer1 = *pointer2;
  15. *pointer2 = tmp;
  16. }
  17.  
  18. return true;
  19. }

  1. //C++特有方式(by-reference):
  2. template <typename Type>
  3. void swapByReference(Type &value1, Type &value2)
  4. {
  5. if (value2 != value1)
  6. {
  7. Type tmp = value1;
  8. value1 = value2;
  9. value2 = tmp;
  10. }
  11. }

小结:

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

冒泡排序(Bubble-Sort)

算法思想:

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

过程:

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

  1. //实现:注意代码中的三个注意点(x):
  2. template <typename Type>
  3. void bubbleSort(Type *begin, Type *end)
  4. {
  5. if ((begin == end) || (begin == NULL) || (end == NULL))
  6. return ;
  7.  
  8. int length = end - begin;
  9. //注意点(1):保证一旦数组有序, 则会直接停止排序, 不会在继续进行无用的循环
  10. bool isOrder = false;
  11.  
  12. //外层循环控制扫描次数(length-1)
  13. //注意点(2):N个元素其实只需N-1次扫描
  14. for (int i = 0; !isOrder && i < length-1; ++i)
  15. {
  16. //首先假定这次数组已经有序
  17. isOrder = true;
  18. //注意点(3):确保能够从0扫描到最后一个未排序的元素
  19. for (Type *iter = begin; iter < end-i-1; ++iter)
  20. {
  21. //如果前面的左边的元素>右边的元素
  22. if (*iter > *(iter+1))
  23. {
  24. //交换
  25. std::swap(*iter, *(iter+1));
  26. isOrder = false;
  27. }
  28. }
  29. }
  30. }
  31.  
  32. template <typename Type>
  33. void bubbleSort(Type *array, int length)
  34. {
  35. return bubbleSort(array, array+length);
  36. }

选择排序(Select-Sort)

思想:

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

要点:

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

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

  1. //实现
  2. template <typename Type>
  3. void selectSort(Type *begin, Type *end)
  4. {
  5. if ((begin == end) || (begin == NULL) || (end == NULL))
  6. return ;
  7.  
  8. //只要循环到最后一个元素的前一个就行了,因为剩下的那个肯定是最大的
  9. for (Type *outer = begin; outer < end-1; ++outer)
  10. {
  11. //注意:是从尚未排序的序列中查找(miner = outer, inner = outer+1)
  12. Type *miner = outer;
  13. //从miner+1开始遍历数组, 寻找一个元素值小于*miner的
  14. for (Type *inner = outer+1; inner < end; ++inner)
  15. {
  16. if (*inner < *miner)
  17. miner = inner;
  18. }
  19.  
  20. if (miner != outer)
  21. std::swap(*miner, *outer);
  22. }
  23. }
  24.  
  25. //为了能够让STL的标准容器如vector使用
  26. template <typename Iterator>
  27. void selectSort(Iterator iter1, Iterator iter2)
  28. {
  29. return selectSort(&(*iter1), &(*iter2));
  30. }
  31.  
  32. template <typename Type>
  33. void selectSort(Type *array, int length)
  34. {
  35. return selectSort(array, array+length);
  36. }

小结:

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

附-测试程序

  1. int main()
  2. {
  3. srand(time(NULL));
  4. vector<double> dVec;
  5. int count = 10;
  6. while (count --)
  7. {
  8. dVec.push_back((rand()%1000)/100.0);
  9. }
  10.  
  11. selectSort(dVec.begin(), dVec.end());
  12. for (vector<double>::iterator iter = dVec.begin(); iter < dVec.end(); ++iter)
  13. {
  14. cout << *iter << endl;
  15. }
  16.  
  17. return 0;
  18. }

数据结构基础(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. Spring Boot+maven打war包

    存在一个坑: 官网文档 指出以下前3步做法,但是这样只可以打出可运行的jar包,要打出war包还要在文档后面的链接跳到另一个页面,才能找到第四步的做法,也就是最终能够打出war包,可能有些朋友有些粗心 ...

  2. [Gradle系列]Gradle发布module库到jCenter, 并构建自己的企业Maven私服

    Tamic 作者: http://blog.csdn.net/sk719887916/article/details/53224544 前言 andorid开发者经常会看到xx公司发布了xx项目,xx ...

  3. TCP发送源码学习(3)--tcp_transmit_skb

    一.tcp_transmit_skb static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, g ...

  4. RxJava(十一)defer操作符实现代码支持链式调用

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52597643 本文出自:[余志强的博客] 一.前言 现在越来越多An ...

  5. log file sync 等侍值高的一般通用解决办法

    log file sync等待时间发生在redo log从log buffer写入到log file期间. 下面对log file sync做个详细的解释. 何时发生日志写入: 1.commit或者r ...

  6. UE4使用第三方库读写xml文件

    原文链接:http://gad.qq.com/article/detail/7181031 本文首发腾讯GAD开发者平台,未经允许,不得转载 在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但 ...

  7. Android下实现手机验证码

    Android实现验证码 效果图 Github地址 地址:https://github.com/kongqw/Android-CheckView 使用 <kong.qingwei.demo.kq ...

  8. cassandra eclipse 环境构建

    摘要 本文主要介绍如何在eclipse中搭建cassandra环境 更多cassandra,nosql 相关知识请访问http://www.webpersonaldeveloper.cn 正文 1.f ...

  9. UE4读取本地XML文件

    其实这里读取XML也是利用了Tinyxml来读取xml,主要是讲Tinyxml放在UE4中,遇到的一点点坑 1.先给出Tinyxml链接:http://www.grinninglizard.com/t ...

  10. 一个ExtJS实例

    聊聊ExtJS 这几天接触了一个项目 前台用的是extjs 发现这个东西还是有点意思的  就把前台的部分 剥离了下来 有兴趣的朋友可以当做模板学习 不多说先上效果图 这篇文章 可以看作是ext知识的一 ...