快排算法 java_快排算法的实现与讲解(java/C++)
快排的算法其实不复杂,但是很少时候,偶尔整的自己头晕,所以写一篇博客,以免以后忘记。
假设我们的数组为:{5,2,1,8,9,3,7,0,4,6},一共10个数字,现在需要将这个数组进行排序。首先我们需要找一个基准数,其实就是参照物,得有个东西跟你对比吧?不然怎么可以呈现出你的美?
假设左边为i=0; 右边j = 9;
方法很简单,分别从数组的左右边两段进行“探测”。首先是左边移动,最左边的第一个数字是5,而最右边的数字是6。
6 >= 5 条件成立,接着左边往右边移动一位(j–)
……
4>=5条件不成立,这个时候就换一下位置,4跟5换。现在的数组应该就是这样子:{4,2,1,8,9,3,7,0,5,6}
接着轮到右边探测,左边的数字已经被替换为4,而右边的是5(因为j自减了一次);那么现在条件对比:
5>=4条件成立,右边往左边靠拢(i++)
5>=2条件成立,右边往左边靠拢(i++)
……
5>=8条件不成立,换位置:{4,2,1,5,9,3,7,0,8,6}
到此,第一轮交换结束。接下来j继续向左挪动(再友情提醒,每次必须是j先出发)。他发现了0(比基准数5要小,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下:
{4,2,1,0,9,3,7,5,8,6}
第二次交换结束,“探测”继续。接着轮到i继续向右挪动,他发现了9(比基准数5要大,满足要求)之后又停了下来。交换之后的序列如下:
{4,2,1,0,5,3,7,9,8,6}
….以此类推,哨兵i继续向右移动,悲剧!!!此时i和j撞上了,说明此时“探测”结束。我们将基准数5和3进行交换。交换之后的序列如下:
{4,2,1,0,3,5,7,9,8,6}
到此“探测”真正结束。此时以基准数5为分界点,5左边的数都小于等于5,5右边的数都大于等于5。
回顾一下刚才的过程,其实j的使命就是要找小于基准数(5)的数,而哨兵i的使命就是要找大于基准数(5)的数,直到i和j撞在一起为止为止。
那么现在数据可以区分为两组:
{4,2,1,0,3, 5 ,7,9,8,6}
左边:4 2 1 0 3
右边:7 9 8 6
数组被分为了两组,然后按照直接的方法进行对比,只是开始i=0;j=9,要变为(先从左边开始):
指针位置:i=0; j=4
数组:4 2 1 0 3
还是上一张图吧,比较好理解:
注:图片是网上找的,数组的排序跟我的不一致,但是看的明白。
最后:
快排的原理很简单;
就是把数组分为两节;
左边的是最小的,而右边的是最大的;
然后再拿左、右边的来继续递归,递归的原理也一样,也是拆分为两节,以此类推。
上代码吧,我写了java跟c的代码:
2.java代码:
public static void main(String[] args) {
int[] arr = {5,2,1,8,9,3,7,0,4,6};
sort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.print(i + " ");
}
}
private static void sort(int[] arr, int l, int r) {
int i = l;
int j = r;
if (l < r) {
while (l < r) {
while (l < r && arr[r] >= arr[l]) {
r--;
}
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
while (l < r && arr[l] <= arr[r]) {
l++;
}
tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
sort(arr, i, l - 1);//递归左边,此时l=5
sort(arr, l + 1, j);//递归右边,此时l=5
}
}
2.那么c++的代码会是怎么样呢?
#include "pch.h"
#include
using namespace std;
void sortQ(int *arr, int l, int r) {
int i = l;
int j = r;
int tmp;
if (i < j) {
while (l < r) {
while (l < r && arr[r] >= arr[l])
{
r--;
}
tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
while (l < r && arr[r] >= arr[l]) {
l++;
}
tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
sortQ(arr, i, l - 1);//处理左边,此时l=5
sortQ(arr, l + 1, j);//处理右边,此时l=5
}
}
int main()
{
std::cout << "Hello World!\n";
int arr[] = {5,2,1,8,9,3,7,0,4,6};
int size = sizeof(arr) / sizeof(arr[0]);
sortQ(arr, 0, size - 1);
for (int i : arr) {
cout << i << " ";
}
}
快排算法 java_快排算法的实现与讲解(java/C++)相关推荐
- 古典密码算法 java_古典密码算法的实现
1.古典密码可以分为代替密码和置换密码两种,这里实现了代替密码中的仿射变换和置换密码中的换位变换. 2.仿射变换: 加密过程:e(x) = ax + b (mod m) 解密过程:d(e(x)) = ...
- 约瑟夫问题算法的实现(代码实现) [Java][数据结构]
约瑟夫问题算法的实现(代码实现) 代码如下(我们将这个方法也定义到单向环形链表类中): 其实我们的约瑟夫问题算法就相当于是一个特殊的删除单向环形链表中的结点的方法,所以我们就写到单向环形链表类中 /* ...
- C++——《数据结构与算法》实验——排序算法的实现
问题描述 1) 动态输入一组数字序列; 2)实现直接插入排序.简单选择排序.冒泡排序.快速排序算法; 3)在主函数中,依次测试上述算法. 类型定义 #define MAX SIZE 100 typed ...
- python实现逻辑回归算法_逻辑回归算法的实现
前言 在之前的学习中,我们已经学习了逻辑回归算法的具体数学原理及其简单的推导过程,现在,我们可以用python实现逻辑回归的算法了. 环境 python3.6 jupyter-notebook 绘制数 ...
- 折半查找算法[二分查找法]算法的实现和解决整数溢出问题~
算法实现的要求: 折半查找法又称为二分查找法,这种方法对待查找的列表有两个要求: 1:必须采用顺序存储结构 2:必须按关键字大小有序排列 算法思想: 将表中间位置记录的关键字与查找关键字进行比较,如果 ...
- 快排算法的针对重复键值的优化
上一节讲了快排算法在序列基本有序的情况下的两种优化方法,这一节我们对新的测试用例进行测试,测试用例如下所示: int main() {//测试 - 待排序列的重复值很多int n = 400000;i ...
- C++Miller Rabin算法的实现(附完整源码)
C++Miller Rabin算法的实现算法 C++Miller Rabin算法的实现算法完整源码(定义,实现,main函数测试) C++Miller Rabin算法的实现算法完整源码(定义,实现,m ...
- java快排算法解读,java 快排的思路与算法
java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...
- 快排算法的Java实现
快排算法的Java实现 快排的核心是找到在无序数组中找到一个数,然后将比他小的数字放在他的左边,比他大的数字放在他的右边.然后递归的对左右两边进行继续排序,直到完成,下面看算法的实现: public ...
最新文章
- 46:八进制到十进制
- Java递归实现二分法
- 从零开始学习docker(九)持久化存储和数据共享之 Data Volume
- texstudio如何安装cjk宏包_MikTex+TexStudio配置论文写作环境
- 像素值与灰度值的区别与关系
- java 步长_java设定窗口步长,依次统计窗口内数值总和
- Chrome浏览器 抢购、秒杀插件,秒杀助手
- 惠普HP DeskJet Ink Advantage 2778 驱动
- iOS 边学边记 直播原理总结,从理论到实践
- 【设计模式】抽象类与接口
- iOS wallet开发
- 一组图片看完“自动驾驶”发展史
- DockerHub使用
- Common Weakness Enumeration (CWE) 2021 Lastest
- zebra 的Thread机制
- 如何修改FLASH动画
- 基于php的学生成绩管理系统——计算机毕业设计
- 电脑录屏怎么录ppt?三个ppt录制视频的方法
- iOS-抠图:去除图片中指定范围颜色的三种方式
- html邮件修改不了图片,邮件模板中的图片不显示,该怎么解决