1 快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

2 分析思路

很明显,先是用到了 partition算法思想(前面的博客提到了),然后再把原始数据分成几部分然后递归同样用partition算法处理

3 代码实现

1) 代码实现方式1

#include <iostream>
#include <vector>using namespace std;/**交换函数*/
void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}/** 打印vector*/
void printVector(vector<int> v)
{for (int i = 0; i < v.size(); ++i){std::cout << v[i] << "\t";}std::cout << std::endl;
}/**partition算法 记得如果这里是C++我们传递的是vector类型,我们记得要加引用,*不然改变不了数据,这里和java传递ArrayList不一样,ArrayList作为参数可以改变集合里面的值,*所以C++如果函数传递非基本数据类型,一半都是带引用的*/
int partitionOne(vector<int>& vector, int start, int end)
{if (start > end){std::cout << "vector is empty or start > end" << std::endl;return -1;}int pivot = vector[start];while (start < end){//我们先从尾巴开始while (start < end && pivot <= vector[end]){--end;}//这里用的数组赋值,而不是直接用swap交换函数,那么下面的2步也是用数组赋值,而不是用swap交换函数vector[start] = vector[end];while (start < end && pivot >= vector[start]){++start;}vector[end] = vector[start];}vector[start] = pivot;printVector(vector);return start;
}/**partition算法, 这里只不过增加了2个变量i和j*,*/
int partitionTwo(vector<int>& vector, int start, int end)
{if (start > end){return -1;}int i = start;int j = end;int pivot = vector[start];while (i < j){//我们先从尾巴开始while (i < j && pivot <= vector[j]){--j;}//这里用的数组赋值,而不是直接用swap交换函数,那么下面的2步也是用数组赋值,而不是用swap交换函数vector[i] = vector[j];while (i < j && pivot >= vector[i]){++i;}vector[j] = vector[i];}vector[i] = pivot;printVector(vector);// quickSort1(vector, start, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/// quickSort1(vector, i + 1, end);return i;
}/**partition算法, 这里只不过增加了2个变量i和j,然后使用了交换函数swap*,*/
int partitionThree(vector<int>& vector, int start, int end)
{if (start > end){return -1;}int i = start;int j = end;int pivot = vector[start];while (i < j){//我们先从尾巴开始while (i < j && pivot <= vector[j]){--j;}while (i < j && pivot >= vector[i]){++i;}//这里用的shiswap交换函数,那么下面的是是也是swap交换函数swap(vector[i], vector[j]);}swap(vector[i], vector[start]);printVector(vector);return i;
}/***快速排序 调用第一个partitionOne*/
void quickSortOne(vector<int>& vector, int start, int end)
{if (vector.size() < 0 || start > end)return;int index = partitionOne(vector, start, end);quickSortOne(vector, start, index - 1);quickSortOne(vector, index + 1, end);
}/***快速排序 调用第二个partitionTwo */
void quickSortTwo(vector<int>& vector, int start, int end)
{if (vector.size() < 0 || start > end)return;int index = partitionTwo(vector, start, end);quickSortTwo(vector, start, index - 1);quickSortTwo(vector, index + 1, end);
}/***快速排序 调用第三个partitionThree*/
void quickSortThree(vector<int>& vector, int start, int end)
{if (vector.size() < 0 || start > end)return;int index = partitionThree(vector, start, end);quickSortThree(vector, start, index - 1);quickSortThree(vector, index + 1, end);
}int main()
{vector<int> v1;//[5,9,2,1,4,7,5,8,3,6]v1.push_back(5);v1.push_back(9);v1.push_back(2);v1.push_back(1);v1.push_back(4);v1.push_back(7);v1.push_back(5);v1.push_back(8);v1.push_back(3);v1.push_back(6);std::cout << "old data print " << std::endl;printVector(v1);quickSortOne(v1, 0, v1.size() - 1);// quickSortTwo(v1, 0, v1.size() - 1);// quickSortThree(v1, 0, v1.size() - 1);std::cout << "after partitionOne" << std::endl;printVector(v1);return 0;
}

运行结果如下

old data print
5   9   2   1   4   7   5   8   3   6
3   4   2   1   5   7   5   8   9   6
1   2   3   4   5   7   5   8   9   6
1   2   3   4   5   7   5   8   9   6
1   2   3   4   5   7   5   8   9   6
1   2   3   4   5   7   5   8   9   6
1   2   3   4   5   6   5   7   9   8
1   2   3   4   5   5   6   7   9   8
1   2   3   4   5   5   6   7   9   8
1   2   3   4   5   5   6   7   8   9
1   2   3   4   5   5   6   7   8   9
after partitionOne
1   2   3   4   5   5   6   7   8   9   

上面我们写了3个parition函数,我们调用quickSortOne(v1, 0, v1.size() - 1)或者quickSortTwo(v1, 0, v1.size() - 1)或者quickSortThree(v1, 0, v1.size() - 1)其中的的一个,结果都是一样。

剑指offer之快速排序相关推荐

  1. 【剑指 offer】—— 快速排序

    两个辅助函数: // 生成区间内的随机整数 int RandInRange(int s, int e, unsigned seed=time_t(0)) { srand(seed);return ra ...

  2. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  3. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  4. 剑指offer(60-67题)详解

    文章目录 60 把二叉树打印成多行 61 序列化二叉树 62 二叉搜索树第K个节点 63 数据流中的中位数 64 滑动窗口的最大值 65 矩阵中的路径 66 机器人的运动范围 67 剪绳子 欢迎关注个 ...

  5. 剑指offer和LeetCode题目笔记

    目录 剑指offer 一.数组 1. 数组中重复的数字 2.二维数组中的查找 多个if和if,elseif语句的区别 3.旋转数组的最小数字 4.构建乘积数组 5.把数组排成最小的数 6.矩阵中的路径 ...

  6. 《剑指offer》题目说明

    剑指offer推荐刷题地址: Leetcode: https://leetcode-cn.com/problemset/lcof (官方授权) 牛客网:https://www.nowcoder.com ...

  7. [字符串] --- 字符串的排列(剑指 Offer 38)

    [试题描述] 输入一个字符串,打印出该字符串中字符的所有排列.你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb ...

  8. C#刷剑指Offer | 【常考题】最小的k个数

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第299篇学习分享 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  9. 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

    关注我--个人公众号:后端技术漫谈 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向. 原创博客主要内容 Java知识点复习全手册 Leetcode算法题解析 ...

最新文章

  1. SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
  2. 蓝桥杯-最大的算式(java)
  3. Cpp 对象模型探索 / 多态的本质
  4. MySQL(5)日志管理、备份与恢复,断点
  5. 图书管理系统c++_校园图书系统写后感
  6. 高考成绩接近满分,却被清华北大拒绝,被称“中国最帅科学家”
  7. npoi 所有列调整为一页_别再浪费纸了,一张纸就能打印Word、Excel、PPT所有内容,真厉害...
  8. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”...
  9. vue ref 属性
  10. 拿来吧你! | 从入门到精通docker ,都在这里了
  11. javascript之字符串常用方法学习 charAt concat indexOf substring substr toUpperCase
  12. drupal7权限控制之-如何访问未发表的node
  13. Redis Java实例
  14. 教师资格证考试攻略(高中信息技术)
  15. 设计过程(概要设计和详细设计)
  16. 华为软件编程规范和范例
  17. DC-DC电源市场现状及未来发展趋势分析
  18. python的turtle库认识和学习(3)之窗体大小和位置
  19. PoE交换机是否是连接NVR和IP摄像机的唯一途径?
  20. Windows 10:解决开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的方法

热门文章

  1. RowVersion字段从SqlServer到PostgreSQL的迁移
  2. 《Redis核心技术与实战》学习总结(1)
  3. 三分钟总览微软任务并行库TPL
  4. 网络协议,没有想象中那么难
  5. CAP 发布 5.0 版本正式发布
  6. 【Git】Git-常用命令备忘录(二)
  7. Java面试必问JVM调优,那.NET5呢?
  8. chrome禁止三方cookie,网站登录不了怎么办
  9. 玩转控件:封装Dev的LabelControl和TextEdit
  10. NET Core 3.0 AutoFac替换内置DI的新姿势