快速排序 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 ...
随机推荐
- MyEclipse配置和使用Maven
maven是管理项目的,myeclipse是编写代码的.第一次写项目都要配置好多东西,很麻烦,now 来看看怎样新建一个maven项目. 工具/原料 myeclipse maven 方法/步骤 ...
- 正确安装Windows server 2012 r2的方法
正确安装Windows server 2012 r2的方法,请看下面的步骤 方法/步骤 1 准备好镜像文件,安装 2 输入密钥,下一步 选择下面(带有GUI的服务器).不要选上面的(服务器核心安装), ...
- mongodb 基础入门教程
算是学习下来精炼的笔记,希望对大家有帮助.如果有问题欢迎大家指正. 0.概述 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保 ...
- STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法
以前比较排斥这两个函数,遇到需要二分的情景都是手写 \(while(left<=right)\). 这次决定洗心革面记录一下这两个函数的在算法竞赛中的用法,毕竟一般不会导致TLE. 其实百度百科 ...
- LeetCode 1046. 最后一块石头的重量 (贪心)
有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那 ...
- 541-反转字符串 II
541-反转字符串 II 给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转.如果剩余少于 k 个字符,则将剩余的所有全部反转.如果有小于 2k 但大于或等 ...
- Django 初试水(三)
在前面的一和二中,分别实现了一些基础的操作,数据库和 Django 自带的管理界面,接下来,主要是创建我们自己的界面(视图). 访问一个地址,对应的服务器直接返回一个视图.这是最常见的交互. 就好比访 ...
- Pytest学习7-参数化
在测试过程中,参数化是必不可少的功能,本文就讨论下pytest的几种参数化方法 @pytest.mark.parametrize:参数化测试函数 1.内置的pytest.mark.parametriz ...
- [CF1034A] Two Rabbits - 数学
判断能否整除即可 #include <bits/stdc++.h> using namespace std; int x,y,a,b; int main() { int t; ios::s ...
- [APIO2010] 回文串 - 回文自动机
经典题吧 我觉得我要换个板子,这结构体板子真TM不顺手 #include <bits/stdc++.h> using namespace std; const int N = 2e6 + ...