【排序】快速排序,C++实现
原创博文,转载请注明出处!
# 基本思想
”快速排序“是对”冒泡排序“的改进。
基本原理:基于分治法,在待排线性表中取一个元素pivot作为枢轴值,通过一趟排序将待排线性表划分为独立的两部分,第一部分的所有元素小于pivot,第二部分的所有元素大于等于pivot,pivot位于其最终位置。递归对两个子表做快速排序。
# C++代码(递归和非递归)
#include <iostream>
#include <vector>
using namespace std; // 一次快速排序
int partition(vector<int> &a, int low, int high)
{
// 枢轴值(线性表第一个元素作为枢轴值)
int key = a[low];
while(low < high)
{
// 从右侧找小于pivot的值,替换low位置的元素
while(low < high && a[high] >= key)
--high;
a[low] = a[high]; // 从左侧找大于pivot的值,替换high位置的元素
while(low < high && a[low] <= key)
++low;
a[high] = a[low];
}
a[low] = key; return low;// 返回一趟排序后确定的元素位置
} //快速排序的递归形式
void QuickSort(vector<int> &a, int low, int high)
{
if(low < high)// 递归出口
{
int loc = partition(a, low, high);//一趟排序结果的调用
QuickSort(a, low, loc-1);
QuickSort(a, loc+1, high);
}
} int main()
{
vector<int> a={46,79,56,38,40,84};
QuickSort(a, 0, a.size()-1); // 打印排序后的数组
for(int i=0;i<a.size();++i)
cout<<a[i]<<' '; return 0;
}
#include <iostream>
#include <vector>
#include <stack>
using namespace std; int partion(vector<int> &root,int low,int high)
{
int part=root[low];
while(low<high)
{
while(low<high&&root[high]>part)
high--;
root[low]=root[high]; while(low<high&&root[low]<part)
low++;
root[high]=root[low];
}
root[low]=part;
return low;
} void quickSort(vector<int> &root,int low,int high)
{
stack<int> st;
int k;
if(low<high)
{
st.push(low);
st.push(high);
while(!st.empty())
{
int j=st.top();st.pop();
int i=st.top();st.pop(); k=partion(root,i,j); if(i<k-1)
{
st.push(i);
st.push(k-1);
}
if(k+1<j)
{
st.push(k+1);
st.push(j);
}
}
}
} int main()
{
vector<int> root = {4,2,6,7,9,5,1,3};
quickSort(root,0,root.size());
for(int i=0;i<8;i++)
cout<<root[i]<<endl;
return 0;
}
【排序】快速排序,C++实现的更多相关文章
- JAVA排序--[快速排序]
package com.array; public class Sort_Quick { /* * 项目名称:快速排序 ; * 项目要求:用JAVA对数组进行排序,并运用快速排序算法; * 作者:Se ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- JS排序--快速排序
用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...
- <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...
- 排序---快速排序及其切分函数Partition应用
快速排序 快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了. 代码如下: public class Sort ...
- 排序技巧——双关键字排序(快速排序,sort)
一个萌新的成长之路 Background 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前. 这时我们可以通过定义cmp函数作为sort的参数进行排序. Solution ...
- Java数据结构之排序---快速排序
快速排序是对冒泡排序的一种改进. 快速排序的基本思想: 假设我们以升序为例,它的执行流程可以概括为,每一趟选择当前所有子序列中的一个关键字(通常我们选择第一个,下述代码实现选择的也是第一个数)作为枢纽 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- 数据结构与算法之PHP排序算法(快速排序)
一.基本思想 快速排序又称划分交换排序,是对冒泡排序的一种改进,亦是分而治之思想在排序算法上的典型应用. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部 ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
随机推荐
- centos7下使用yum安装mysql数据库
CentOS7的yum源中默认是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1.下载并安装MySQL官方的 Yum Repository wget -i -c http: ...
- 【Semantic Segmentation】DeepLab V3(转)
原文地址:DeepLabv3 代码: TensorFlow Abstract DeepLabv3进一步探讨空洞卷积,这是一个在语义分割任务中:可以调整滤波器视野.控制卷积神经网络计算的特征响应分辨率的 ...
- 数据结构实习 problem L 由二叉树的中序层序重建二叉树
由二叉树的中序层序重建二叉树 writer:pprp 用层序中序来重建二叉树 代码点这里 其实本质上与前序中序建立二叉树没有什么太大区别 大概思路: 递归解法,对当前层进行处理,通过层序遍历可以得到当 ...
- JavaScript高级程序设计-读书笔记(5)
第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...
- JSP 连接数据库
本章节假设您已经对JDBC有一定的了解.在开始学习JSP数据库访问前,请确保JDBC环境已经正确配置. 首先,让我们按照下面的步骤来创建一个简单的表并插入几条简单的记录: 创建表 在数据库中创建一个E ...
- Bash 快捷键[转]
编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) Ctrl + b :按字符后移(左向) Alt + f :按单词前移(右向) Al ...
- Spring的引用内部Bean属性和给级联属性
第一个是内部Bean的配置: 首先是要理解其中的原理,再去操作就很简单了,下面老表就给大家说一下自己的观点(有点简单,但是老表我第一次学习的时候看着视频上的代码确实有点懵逼 ...
- nginx模块记录
1. ngx_http_ssl_module 让Nginx可以支持HTTPS的模块 (1)ssl on | off; #是否开启ssl功能 (2)ssl_certificate file; #当前虚拟 ...
- C++设计模式之-外观模式
意图: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 适用性: 1.在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要 ...
- iOS二维码、条形码生成(可指定大小、颜色)
一.前言: iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小.指定颜色的二维码和条形码, 还 ...