排序算法之五 快速排序(C++版本)
一. 实现原理
快速排序的相关知识,参考漫画:什么是快速排序?
二. 具体实现
挖坑法和指针交换法只是Partition算法实现不一样。
实现中有一点需要注意:快速排序中Partition算法总是从右边开始查找的原因
void QuickSort(int* pData, int begin, int end)
{if (nullptr == pData || begin < 0 || end < 0) return;if (begin >= end) return; // 只有一个节点int pivotIdx = Partition(pData, begin, end);QuickSort(pData, begin, pivotIdx - 1);QuickSort(pData, pivotIdx + 1, end);
}
1. 挖坑法
int Partition(int* pData, int begin, int end)
{int pivot = pData[begin];int left = begin + 1;int right = end;int index = begin; // 空位的初始位置while (left < right){while (left < right && pData[right] >= pivot) --right; // 从右往左找第一个小于pivot的元素if (left < right){pData[index] = pData[right]; // 填空位index = right; // 新的空位--right;}while (left < right && pData[left] <= pivot) ++left; // 从左往右找以一个大于privot的的元素if (left < right){pData[index] = pData[left];// 填空位index = left; // 新的空位++left;}}pData[index] = pivot; // 使用pivot填空位return index;
}
2.指针交换法
int Partition(int* pData, int begin, int end)
{int pivot = pData[begin]; // 以第一个元素作为基准值int left = begin;int right = end;while (left < right){while (left < right && pData[right] >= pivot) --right; // 从右往左找第一个小于pivot的元素while (left < right && pData[left] <= pivot) ++left; // 从左往右找以一个大于privot的的元素if (left < right) std::swap(pData[left], pData[right]);}if (begin != left) std::swap(pData[begin], pData[left]); // 如果右边的元素都大于等于pivot会出现right = left = beginreturn left;
}
排序算法之五 快速排序(C++版本)相关推荐
- 十种经典排序算法精粹(c语言版本)
下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...
- php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)
常用的排序算法系列 快速排序 假设当前需要从小到大进行排序,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较.从后往前找,比key小元素放在数组前面.然 ...
- 十大排序算法之快速排序(两种方法)
十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...
- 排序算法之----快速排序(快速上手快速排序)
排序算法之----快速排序(快速上手快速排序) 何为快速排序算法? 快速排序的基本思想又是什么? 其实很简单: 快速排序的基本思想是 1.先从数列中取出一个数作为基准数(这里我们的算法里面取数组最右边 ...
- 插入排序算法 java_排序算法实现-插入排序(Java版本)
原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...
- 排序算法(5)快速排序
排序算法(5)快速排序 思想:递归,分治法. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区 ...
- 【排序算法】快速排序(C语言)
[排序算法]-- 快速排序 目录 一.快速排序的单趟排序 1. 霍尔法 2. 挖坑法 3. 前后指针 二.快速排序 1. 排序步骤 2. 排序完整步骤图 3. 快速排序代码 3.1 递归实现 3.2 ...
- 排序算法——随机快速排序
引言 随机快排是一个非常有意思的排序排序算法,它的算法思想用到了如递归.荷兰国旗问题等诸多元素,还意外的引入了随机性的概念. 以下将逐步总结三个版本的快速排序,由浅入深总结快速排序的经典实现过程. 荷 ...
- 排序算法(5) -- 快速排序
一.前言 快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出. 二.算法思想 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都 ...
- 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...
八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...
最新文章
- 一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...
- *44.程序的链接方式
- 使用WMI对象收集计算机信息
- tensorflow版本问题导致的错误AttributeError: module ‘tensorflow‘ has no attribute ‘***‘
- Oracle 事务概述
- 深度学习:tensorflow层次结构,朴素NN代码实现tensorflow
- 全国计算机等级考试收费不一样,2018年北京全国计算机等级考试收费标准
- 免费zblog mip主题aymFreeTwo
- python:安装pycaret2.2.3(pytorch版本为1.7.1)
- 这将是你看到过最全的pdf预览解决方案
- 写贺卡给毕业师姐怎么写计算机系的,给师兄师姐的毕业贺卡寄语
- 《连线》长文特写李飞飞:已识乾坤大,犹怜草木青
- Qiyuan-python接小球游戏2.0
- ISP许可证办理攻略全了解
- tensorflow中的ops(或者说op)的理解
- 面试时如何用英语自我介绍?
- Revit二次开发——自动标注轴网
- 海思16DV300系统搭建过程
- serious game原型设计活动前期总结——Interlocking小组
- push与push_back
热门文章
- mysql用户创建、授权
- “深度学习”是人工智能的一场革命吗?
- 2012-1-31学习日记
- 在ASP.NET中使用AJAX的简单方法 转载
- 1.支付平台架构:业务、规划、设计与实现 --- 收银台业务
- 119. PHP 性能问题(2)
- 6. access_token
- 21. Element isContentEditable 属性
- chanlist.php,Nginx+FastCgi+Php 的工作机制
- Chapter 4 Invitations——10