/*
* 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++迭代,递归)的更多相关文章

  1. 归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题

    归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想. 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了 ...

  2. json数据中的某一个字段进行快速排序quicksort

    快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格. 核心的思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 ...

  3. 排序算法四:快速排序(Quicksort)

    快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...

  4. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  5. 快速排序(quicksort)算法实现

    快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的位 ...

  6. 递归-快速排序quickSort

    现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列中所有比基准数 ...

  7. 算法分析-快速排序QUICK-SORT

    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的 ...

  8. 快速排序QuickSort

    前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及arr ...

  9. 排序算法TWO:快速排序QuickSort

    import java.util.Random ; /** *快速排序思路:用到了分治法 * 一个数组A[0,n-1] 分解为三个部分,A[0,p - 1] , A[p] , A[p + 1, n-1 ...

随机推荐

  1. 【spring boot】SpringBoot初学(3)– application配置和profile隔离配置

    前言 github: https://github.com/vergilyn/SpringBootDemo 说明:我代码的结构是用profile来区分/激活要加载的配置,从而在一个project中写各 ...

  2. Redis可能出现的问题

    缓存穿透 一般出现这样的问题,是因为当我们查询一条肯定不存在的数据的时候,缓存中没有,就会透过缓存来查询数据库,数据库也不存在,这样就不会将值保存在缓存中,最后还是缓存和数据库中都没有,如果一直访问这 ...

  3. vjudge I - Vladik and fractions 一道小学生的提。

    原题链接:https://vjudge.net/contest/331993#problem/I Vladik and Chloe decided to determine who of them i ...

  4. ASPxGridView 排序、分页、加载数据必需的三个函数

    protected void ASPxGridViewPoint_OnCustomCallback(object sender, ASPxGridViewCustomCallbackEventArgs ...

  5. wget安装nginx

    #下载: wget http://nginx.org/download/nginx-1.8.0.tar.gz #解压: tar -zxvf nginx-1.8.0.tar.gz #安装依赖插件 yum ...

  6. MFC线程间消息传递(转)

    原文地址:https://blog.csdn.net/qq_37059136/article/details/84972192

  7. set的使用

    集合是Python的一种数据类型,集合是一个可变容器.常用于列表的去重. 什么是集合 集合是一个可变容器 集合中的数据对象都是唯一的(不可重复) 集合是无序的存储结构 集合是可迭代对象 集合内的元素是 ...

  8. LightOJ-1370 Bi-shoe and Phi-shoe (欧拉函数+二分)

    Problem Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe ...

  9. js判断Android和Ios

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  10. Ubuntu下vsc+python3配置

    我发现直接搜这个很容易得到过时的文章py2请滚蛋好么 1.首先下去VSC官网下载.deb的安装包,安装好vsc,打开后安装PYTHON,reload下.别啊忘记修改路径,setting下搜python ...