C++快速排序(二)
引言
此文继上一次的c++快速排序之后,是时隔一年后的重新领悟。快速排序就是从一列序列中选择一个数作为基数,一般以左边第一个元素为基数,然后定义两个变量left与right,left指向左边第一个元素,与基数指向相同,right指向右边倒数第一个元素,从右侧开始移动right找到比基数小的元素,然后从左侧开始找到比基数大的元素,将右侧比基数小的元素与左侧比基数大的元素,即left与right指向的元素交换位置,再继续从右边开始移动right找出比基数小的元素,移动左边的left找到比基数大的元素,交换right与left指向的元素的位置,继续执行该操作,直到lfet指向的元素与right指向的元素是同一个元素,此时交换left指向的元素与基数的值,达到了左边的元素比基数小,右边的元素比基数大,再将基数左边所有的元素看成一个序列,基数右边所有的元素看成一个序列,两个序列按照之前的方式,选取左起第一个元素为基数,同时left指向左起第一个元素,right指向序列最后一个元素,继续之前的操作。基数选择左起第一个元素时,要先从右边开始移动下标查找,基数选择右边的元素,需要从左边开始移动查找。与按照从小到大的顺序排列和从大到小的顺序排列没有关系。
示例
下面是实现快速排序的代码,采用vs2010开发的控制台输出程序:
// quickSort.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <stdlib.h>
#include <iostream>using namespace std;/************************************************************************/
/* 功能:快速排序 (从小到大)3,5,2,7,9,1,6功能函数:void quickSort(int *parr,int left,int right) 快速排序void printArr(int *parr,int n) 输出数组元素*/
/************************************************************************/void quickSort(int *parr,int left,int right)
{int base,temp;int i = left;int j = right;base = parr[left];if(left >= right)//一个数或者不满足left<right则跳出循环{return;}while (i < j)//左边下表小于右边{while (parr[j] >= base && i < j)//右侧开始,寻找比基数小的元素,未找到下标减减{--j;}while(parr[i] <= base && i < j)//左侧开始找比计数大的元素,未找到下标加加{++i;}if (i < j)//坐标的下标小于右边的下标,且找到左边比基数大的元素,右边比基数小的元素,交换位置{temp = parr[j];parr[j] = parr[i];parr[i] = temp;}}parr[left] = parr[i];//左边的下标等于右边的下标,交换该元素,与基数的位置parr[i] = base;quickSort(parr,left,i-1);//左边序列排序quickSort(parr,i+1,right);//右边序列排序
}void printArr(int *parr,int n)
{for(int i = 0; i < n; ++i){cout<<parr[i]<<"\t";}
}int _tmain(int argc, _TCHAR* argv[])
{int arr[] = {3,5,2,7,9,1,6};printArr(arr,7);cout<<endl;quickSort(arr,0,6);printArr(arr,7);cout<<endl;system("pause");return 0;
}
项目的结构:
运行效果
重在理解,仅供参考。
C++快速排序(二)相关推荐
- [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
最近在做LeetCode的题目.面试和笔试后发现经常考察快速排序的知识.通过这篇文章介绍,能让你彻底的了解和学习快排,主要从一下三个部分进行介绍: 一.C语言实现qsort快速排序 ...
- C语言版--单链表排序,冒泡排序,选择排序,插入排序,快速排序,应有尽有,保证看懂,没有bug!交换节点版本!
一.废话不多说,直接上代码.如果想看双向循环链表的朋友,可以在我的博客里找. 你好 #include <stdio.h> #include <stdlib.h>typedef ...
- 《算法撕裂者》03 - 快速排序
文章目录 零.前言 一.排序必学之快速排序 二.性能分析及算法改进 1.切换到插入排序 2.三数取中 3.三向切分 三.总结 零.前言 这篇快速排序的文章其实之前就写了,但是当时有个疑问就一直没发,今 ...
- 快速排序之JavaScript版
基本思想 分治法 每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边. 在最坏的情况下,仍可能是相邻的两个数进行了交换.因此快速排序的最差 ...
- Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)
Algorithm:C++语言实现之内排序.外排序相关算法(插入排序 .锦标赛排序.归并排序) 目录 一.内排序 1.插入排序 2.锦标赛排序 3.归并排序 二.外排序 1.过程 一.内排序 1.插入 ...
- 速来围观!leetcode java实现汇总
文章目录 前言 一.排序 1.1 选择排序 1.2 冒泡排序 1.3 插入排序 1.4 归并排序 1.5 快速排序 二.查找 2.1 二分查找(有序数组找某个数是否存在) 三.寻找最大数字 四.两数之 ...
- 常用七大经典排序算法总结(C语言描述)
目录 一.交换排序 1.冒泡排序 2.快速排序 二.插入排序 1.直接插入排序 2.希尔(shell)排序 三.选择排序 1.直接选择排序 2.堆(Heap)排序 四.归并排序 正文 简介 其中排序算 ...
- 一文了解分而治之和动态规则算法在前端中的应用
一文了解分而治之和动态规则算法 一.分而治之 1.分而治之是什么? 2.应用场景 3.场景剖析:归并排序和快速排序 二.动态规则 1.动态规则是什么? 2.应用场景 3.场景剖析:斐波那契数列 4.动 ...
- java 实现内存数据表_数据结构 Java中的内存
根据线性表的实际存储方式,分为两种实现模型: 顺序表 ,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示. 链表 ,将元素存放在通过链接构造起来的一系列存储块中. 一.顺 ...
- 【游戏后端】游戏服务器端开发的一些建议(转载)
摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结.第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一 ...
最新文章
- Stream Processing: S4系统模型分析和关键源码读解
- 屏蔽storm ui的kill功能
- Java实现文件上传-按钮弹出上传页面
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
- 使用sitemesh建立复合视图 - 1.hello
- RKNN Toolkit使用教程
- php strtoupper 和 array_change_key_case 字符串转大写,小写
- 前端学习(1031):jquery多库共存
- 怎么利用GitHub
- c# wpf 面试_【远程面试】九强通信 | 九洲电器集团全资子公司
- 计算机网络之数据链路层:19、总结
- python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
- 《Linux指令从入门到精通》——4.4 Linux下的文本编辑指令
- 移动端手机抓包工具小助手
- Android 抓包工具
- 3分钟下载好网易云付费音乐
- canvas 踩坑 * 小球弹性碰撞逻辑解析
- 中标麒麟matlab,中标麒麟(龙芯CPU)--忘记root密码怎么修改?
- linux动画制作软件,你也可以成为设计师!宫崎骏御用2D动画制作软件
- 【完全背包或哈希映射】HDU-1248 寒冰王座
热门文章
- 最IN的云原生架构,阿里云 Serverless 事件总线 EventBridge 重磅发布
- 莉莉丝《剑与远征》:基于阿里云全站加速提升用户体验
- 【人工智能】AI如何把招人效率提高四成
- 前端内存优化的探索与实践
- OpenKruise - 云原生应用自动化引擎正式开源
- 从遇见到信任 | Apache Dubbo 的毕业之旅
- 云原生/低代码/数据科学/计算等方向内容整理志愿者招募了!
- “毕业1年,做Python挣了50W!”网友:吹得太少..
- 电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?
- python封装c接口_用C为python3.1封装mysql接口(一)