【经典】【排序】快速排序算法、堆排序
来源:互联网 发布:域名劫持软件 编辑:程序博客网 时间:2024/05/19 19:43
来源:脑客爱刷题
快速排序:
本算法主要改进了快排的partition算法,使得每次partition后,等于target的数在未排序部分的“中间”连续出现,target左边部分比它小,右边部分比它大。
void partition(vector<int> &num, int begin, int end){if (begin >= end)return;int smaller = begin - 1, bigger = end + 1, cur = begin + 1, target = num[begin];while (cur != bigger){if (num[cur] == target){cur++;}else if (num[cur] < target){swap(num[cur], num[smaller + 1]);smaller++;cur++;}else{swap(num[cur], num[bigger - 1]);bigger--;}}partition(num, begin, smaller);partition(num, bigger, end);}void quicksort(vector<int> &num){if (num.size() <= 1)return;partition(num, 0, num.size() - 1);}
堆排序:
//数组[0,index-1]的范围内都是已经建成的最大堆,现在要把num[index]加入堆中void heapInsert(vector<int> &num, int index){while (index != 0){int parent = (index - 1) / 2;if (num[parent] < num[index])swap(num[parent], num[index]);elsebreak;index = parent;}}//num[0]不在堆的正确位置,把它往下“沉”,直到正确位置为止,堆的范围是[0,size-1]void heapDown(vector<int> &num, int size){int index = 0, largest = index, left = index * 2 + 1, right = index * 2 + 2;while (left < size){if (num[left] > num[largest])largest = left;if (right<size && num[right] > num[largest])largest = right;if (largest != index){swap(num[largest], num[index]);index = largest;left = index * 2 + 1;right = index * 2 + 2;}elsebreak;}}void heapsort(vector<int> &num){if (num.size() <= 1)return;for (int i = 1; i < num.size(); i++){heapInsert(num, i);//建立最大堆}for (int i = num.size() - 1; i >= 1; i--){swap(num[0], num[i]);heapDown(num, i);}}
0 0
- 【经典】【排序】快速排序算法、堆排序
- 【经典算法】堆排序
- 经典算法:堆排序
- 【经典排序算法】选择排序、堆排序
- 【经典排序算法】快速排序
- 经典排序算法--快速排序
- [快速排序] 经典排序算法
- 排序算法-快速排序和堆排序
- 【经典算法】快速排序
- 经典算法:快速排序
- 经典算法--快速排序
- 经典算法--快速排序
- 【经典算法】:快速排序
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 六大经典排序算法 java 选择排序、插入排序、冒泡排序、快速排序、堆排序、归并排序,六大经典排序算法,
- 六大经典排序算法 java 选择排序、插入排序、冒泡排序、快速排序、堆排序、归并排序,六大经典排序算法,
- 经典排序算法 - 堆排序Heap sort
- ireport 的一些技巧
- 吴恩达 机器学习 笔记 some tips on applying machine Learning
- 反汇编之流程控制语句的识别(if...else...语句)
- 浅谈 android ANR 如何找有用的信息
- 友情链接 兼 留言板(在别的地方留言博主可能会没看到哦- -)
- 【经典】【排序】快速排序算法、堆排序
- 写给工作中的你(如果你的才华不能支撑你的梦想,请低下头继续学习)
- 数据结构学习笔记——树与森林
- 了解碎片
- JSTL使用总结(2) fmt标签库和fn标签库
- C++的强制转换(4个关键字)
- 即时通讯——XMPP
- Number of 1 Bits
- MySQL 学习笔记(1)