快速排序的思路

众所周知,快速排序的核心思想是:选定基准值并排好其位置, 根据基准值将序列分割两半,分别递归之。

单链表寻找基准点的方法:用两个指针i和j,这两个指针均往next方向移动,移动的过程中保持i之前的节点值都小于(或大于)选定的基准值key,i和j之间的节点值都大于(或小于)key,那么当j走到末尾的时候便完成了一次分割支点的寻找。

(参考博文:http://blog.csdn.net/wumuzi520/article/details/8078322)


冒泡排序的思路

冒泡排序的核心思想是:每次将未排好部分的最小值(或最大值)通过交换放到未排好部分的最后(或开头)

单链表因为不能随机存取,需要稍微改变一下策略:使用指针i遍历序列,通过内层循环(通过指针j,j循环的区间[i, end),也就是未排好部分)使得每次i位置的节点值是最大(最小)的。


C++代码实现

#include <iostream>
#include <algorithm>
#include <list>
using namespace std;// 找到快速排序的分割点
template <typename OutputIterator>
OutputIterator Partition(OutputIterator first, OutputIterator last)
{OutputIterator i = first, j = first;++ j;while(j != last){if(*j < *first){++ i;swap(*i, *j);}j ++;}swap(*first, *i);return i;
}// 快速排序
template <typename OutputIterator>
void QuickSort(OutputIterator first, OutputIterator last)
{if(first != last){OutputIterator mid = Partition(first, last);QuickSort(first, mid);QuickSort(++ mid, last);}
}// 冒泡排序
template <typename OutputIterator>
void BubbleSort(OutputIterator first, OutputIterator last)
{for(OutputIterator i = first; i != last; ++ i){for(OutputIterator j = i; j != last; ++ j){if(* i > *j){swap(*i, *j);}}}
}//输出序列
template <typename InputIterator>
void Print(InputIterator first, InputIterator last)
{while(first != last){cout << *first++ << " ";}cout << endl;
}int main()
{list<int> li = {0, 5, 4, 6, 8, 7, 2, 9, 3, 1};QuickSort(li.begin(), li.end());Print(li.begin(), li.end());list<char> li2 = {'a', 'e', 'd', 'c', 'f', 'h', 'b', 'g', 'j', 'i'};BubbleSort(li2.begin(), li2.end());Print(li2.begin(), li2.end());return 0;
}

这里都是非递减排序


效果图


链表的快速排序及冒泡排序相关推荐

  1. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...

    前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的 看看快排在最坏的情况下(O(n²)),且不使用辅助空间 ...

  2. 趣味编程:函数式链表的快速排序(参考答案)

    之前我提出了一个"趣味编程",模仿Haskell的方式对一个链表进行快速排序.在那篇文章中我解释了Haskell列表的结构,并给出了ImmutableList的基础实现.快速排序的 ...

  3. 快速排序,冒泡排序时间复杂度推导

    快速排序,冒泡排序时间复杂度推导 快速排序时间复杂度分析: 数组长度为n 1,平均复杂度: t(n) = cn + 2t(n/2) = cn + 2(cn/2 + 2t(n/4)) = 2cn + 4 ...

  4. 单链表的快速排序(转)

    2010年11月30日 星期二 15:13 单链表的快速排序和数组的快速排序在基本细想上是一致的,以从小到大来排序单链表为例, 都是选择一个支点,然后把小于支点的元素放到左边,把大于支点的元素放到右边 ...

  5. 快速排序与冒泡排序的效率对比

    快速排序与冒泡排序的效率对比 鄙人在这里谈一下自己对冒泡排序与快速排序的看法,在经过详细的浏览代码以及文章后,我们可以得出以下结论: 1 快速排序是冒泡排序的一种改进,跟冒泡排序有一定的区别. 2. ...

  6. c语言排序(快速排序,冒泡排序,选择排序,插入排序,桶排序)

    快速排序,冒泡排序,选择排序,插入排序,桶排序 文章目录 什么是排序 快速排序 实现流程 代码 改进版快速排序代码 注意点 冒泡排序 实现流程 实现代码 选择排序 实现代码 插入排序 实现代码 桶排序 ...

  7. C++十种排序方法(快速排序、冒泡排序等等)

    C++十种排序方法(快速排序.冒泡排序等等) 一.冒泡排序 1.概念及思路:冒泡排序顾名思义就是大的数沉下去,小的数浮上来,就跟气泡在水底浮上来一样:基本的思路很简单,就是相邻的两个数相比较,如果前面 ...

  8. 趣味编程:函数式链表的快速排序

    前一段时间有朋友问我,以下这段Haskell快速排序的代码,是否可以转化成C#中等价的Lambda表达式实现: qsort [] = [] qsort (x:xs) = qsort (filter ( ...

  9. 基于链表的快速排序C语言,双向链表的快速排序算法,编译通过,程序会崩溃,求助一下各位...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 要求就是在双向链表上实现快速排序:(.cpp文件) #include #include #define TRUE 1 #define FALSE 0 #d ...

最新文章

  1. Jvm 系列(三):GC 算法 垃圾收集器
  2. 转 ios 里如何判断当前应用的定位服务是否可用
  3. 一个编程菜鸟的进阶之路(C/C++)
  4. Zookeeper选举算法( FastLeader选主)
  5. 关于jQuery对象(类数组对象)以及DOM对象相互转化问题——[object Object]和[object HTMLInputElement]
  6. DateTime和字符串转换问题
  7. RTT的线程同步篇——异常管理
  8. 我是一个请求,我该何去何从
  9. centos重启mysql_CentOS 7下启动、关闭、重启、查看MySQL服务
  10. eclipse 如何关联git_作为一名初学Java者 如何做简单的Java项目
  11. JavaScript学习(七)
  12. 查询瀚高数据库的创建时间
  13. 基于MPC的自适应巡航控制
  14. nimi SearchEngin 项目思路及算法
  15. 计算机仿真和计算机应用与软件,计算机应用与软件杂志 - 第 2 页 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  16. AB32VG1项目之智能晾衣架
  17. 【反编译系列】四、反编译so文件(IDA_Pro)
  18. Kibana KQL语法
  19. 企业微信+微信+简道云+API:创建贴心实用的学生请假系统(二)之技术方案
  20. scheme的应用序

热门文章

  1. 经典IIR数字滤波器设计一般步骤的总结
  2. Convert的用法
  3. 排列组合|分组和分配问题
  4. 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)
  5. python--dict容器
  6. Lesson 13-14 How often do you exercise?
  7. 激光SLAM入门笔记(五):前端配准 II
  8. IOS 开发 iPhone屏幕尺寸、分辨率及适配
  9. 2022年12月10日作业
  10. 路由表是干什么的?底层原理是什么?