剑指offer之快速排序
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之快速排序相关推荐
- 【剑指 offer】—— 快速排序
两个辅助函数: // 生成区间内的随机整数 int RandInRange(int s, int e, unsigned seed=time_t(0)) { srand(seed);return ra ...
- 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- 剑指offer(60-67题)详解
文章目录 60 把二叉树打印成多行 61 序列化二叉树 62 二叉搜索树第K个节点 63 数据流中的中位数 64 滑动窗口的最大值 65 矩阵中的路径 66 机器人的运动范围 67 剪绳子 欢迎关注个 ...
- 剑指offer和LeetCode题目笔记
目录 剑指offer 一.数组 1. 数组中重复的数字 2.二维数组中的查找 多个if和if,elseif语句的区别 3.旋转数组的最小数字 4.构建乘积数组 5.把数组排成最小的数 6.矩阵中的路径 ...
- 《剑指offer》题目说明
剑指offer推荐刷题地址: Leetcode: https://leetcode-cn.com/problemset/lcof (官方授权) 牛客网:https://www.nowcoder.com ...
- [字符串] --- 字符串的排列(剑指 Offer 38)
[试题描述] 输入一个字符串,打印出该字符串中字符的所有排列.你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb ...
- C#刷剑指Offer | 【常考题】最小的k个数
[C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第299篇学习分享 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...
- 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字
关注我--个人公众号:后端技术漫谈 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向. 原创博客主要内容 Java知识点复习全手册 Leetcode算法题解析 ...
最新文章
- SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
- 蓝桥杯-最大的算式(java)
- Cpp 对象模型探索 / 多态的本质
- MySQL(5)日志管理、备份与恢复,断点
- 图书管理系统c++_校园图书系统写后感
- 高考成绩接近满分,却被清华北大拒绝,被称“中国最帅科学家”
- npoi 所有列调整为一页_别再浪费纸了,一张纸就能打印Word、Excel、PPT所有内容,真厉害...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”...
- vue ref 属性
- 拿来吧你! | 从入门到精通docker ,都在这里了
- javascript之字符串常用方法学习 charAt concat indexOf substring substr toUpperCase
- drupal7权限控制之-如何访问未发表的node
- Redis Java实例
- 教师资格证考试攻略(高中信息技术)
- 设计过程(概要设计和详细设计)
- 华为软件编程规范和范例
- DC-DC电源市场现状及未来发展趋势分析
- python的turtle库认识和学习(3)之窗体大小和位置
- PoE交换机是否是连接NVR和IP摄像机的唯一途径?
- Windows 10:解决开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的方法