快速排序 QuickSort (C++迭代,递归)
/*
* QuickSort.h
* 快速排序(将每一个元素转换为轴点元素)
* Created on: 2020年2月12日
* Author: LuYonglei
*/ #ifndef SRC_QUICKSORT_H_
#define SRC_QUICKSORT_H_
#include <vector>
#include <stack>
#include <cstdlib>
#include <ctime>
using namespace std; template<typename T>
int compare(const T &left, const T &right) {
//比较两个元素大小
//left > right return 1
//left = right return 0
//left < right return -1
return left > right ? : (left == right ? : -);
} template<typename T>
int pivotIndex(vector<T> &arr, int begin, int end) {
//构造出arr中的轴点元素并返回索引位置
//为保证尽可能不出现最坏情况,随机选择一个begin-end范围内的元素作为轴点元素
srand(time());
int randIndex = rand() % (end - begin);
//把随机选择的轴点位置和begin位置交换元素
swap(arr[begin], arr[begin + randIndex]);
//备份begin位置的元素
T pivotValue = arr[begin];
//end指向最后一个元素
end--;
//当begin<end时进行扫描
while (begin < end) {
while (begin < end) {
//先从右往左扫描
if (- == compare(pivotValue, arr[end])) {
//如果轴点元素小于end位置的元素
end--;
} else {
//轴点元素大于等于end位置元素
arr[begin] = arr[end];
begin++;
break;
}
}
while (begin < end) {
//从左往右扫描
if (compare(pivotValue, arr[begin]) == ) {
//如果轴点元素大于begin位置的元素
begin++;
} else {
//如果轴点元素小于等于begin位置的元素
arr[end] = arr[begin];
end--;
break;
}
}
}
//将轴点位置用value覆盖
arr[begin] = pivotValue;
//返回轴点元素位置
return begin;
} #if 0
//递归实现
template<typename T>
void sort(vector<T> &arr, int begin, int end) {
//对[begin,end)范围内的元素进行快速排序
if ((end - begin) < )
return;
int pivot = pivotIndex(arr, begin, end);
sort(arr, begin, pivot);
sort(arr, pivot + , end);
} #else
//迭代实现
typedef struct _sortPair {
int begin;
int end;
} SORT_PAIR; template<typename T>
void sort(vector<T> &arr, int begin, int end) {
if ((end - begin) < )//元素个数小于2,直接退出
return;
stack<SORT_PAIR> s;
s.push(SORT_PAIR { begin, end });
int sBegin=;
int sEnd=;
int pivot=;
while (s.size() != ) {
sBegin = s.top().begin;
sEnd = s.top().end;
pivot = pivotIndex(arr, sBegin, sEnd);//确定轴点元素位置
s.pop();//弹出栈顶元素
if ((pivot - sBegin) >= ) {//元素个数大于等于2,才需要进行排序
s.push(SORT_PAIR { sBegin, pivot });
}
if ((sEnd - pivot - >= )) {//元素个数大于等于2才需要进行排序
s.push(SORT_PAIR { pivot + , sEnd });
}
}
} #endif template<typename T>
void quickSort(vector<T> &arr) {
sort(arr, , arr.size());
} #endif /* SRC_QUICKSORT_H_ */
快速排序 QuickSort (C++迭代,递归)的更多相关文章
- 归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题
归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想. 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了 ...
- json数据中的某一个字段进行快速排序quicksort
快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格. 核心的思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 ...
- 排序算法四:快速排序(Quicksort)
快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...
- 算法实例-C#-快速排序-QuickSort
算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...
- 快速排序(quicksort)算法实现
快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的位 ...
- 递归-快速排序quickSort
现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列中所有比基准数 ...
- 算法分析-快速排序QUICK-SORT
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的 ...
- 快速排序QuickSort
前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及arr ...
- 排序算法TWO:快速排序QuickSort
import java.util.Random ; /** *快速排序思路:用到了分治法 * 一个数组A[0,n-1] 分解为三个部分,A[0,p - 1] , A[p] , A[p + 1, n-1 ...
随机推荐
- C#中System.ServiceProgress报错
场景 在C#中检索本地计算机所有服务时,使用 System.ServiceProcess.ServiceController[] services = System.ServiceProcess.Se ...
- pyqt5-下拉框联动效果
from PyQt5.Qt import * class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindo ...
- Spring Cloud feign使用okhttp3
指南 maven <dependency> <groupId>io.github.openfeign</groupId> <artifactId>fei ...
- gulp常用插件之pump使用
更多gulp常用插件使用请访问:gulp常用插件汇总 pump这是一款小型节点模块,可将流连接在一起并在其中一个关闭时将其全部销毁. 使用标准source.pipe(dest)源时,如果dest发出关 ...
- IO流学习之字符流(二)
用字符流完成文档的复制: 测试文档: 代码1: package InputOutput; import java.io.FileReader; import java.io.FileWriter; i ...
- 为什么MYSQL分页时使用limit+ order by会出现数据重复问题
问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据, 示例sql如下: select a,b from c where d = ' ...
- codeforces每日一题1-10
目录: 1.1093D. Beautiful Graph(DFS染色) 2.514C - Watto and Mechanism(Tire) 3.69E.Subsegments(STL) 4.25C. ...
- Sass和Scss
Sass:https://www.sass.hk/ Sass是什么 Sass 是一款强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (variables).嵌套 (nested rul ...
- UML 建模 -- 基础知识
1.UML简介 UML(Unidied Modeling Language)为面向对象软件设计提供统一的,标准的,可视化的建模语言.适用于以用例为驱动,以体系结构为中心的软件设计全程 2.UML模型的 ...
- 回溯经典(指定位置N皇后问题)
N皇后问题自不必多说,这道题的先行条件是在放置的时候已经指定了一个棋子的位置. 输入第一行为N,第二行为指定棋子的坐标(x,y):输出方案总数以及按字典序升序的各种方案. 思路: 首先是回溯,其次对待 ...