首页 > 其他分享 >快速排序

快速排序

时间:2024-01-24 22:44:25浏览次数:21  
标签:快排 int 交换 -- 数组 区间 排序 快速

快排


 

做法


 

快排,基于分治

1.确定分界点,q[l],q[(l+r)/2],q[r],随机,四种都可以,但是推荐q[(l+r)/2]

2.[重点]调整区间,划分2个区间,使得左半边所有的数<=x,右半边所有的数>=x,注意,x不一定在两个区间交界处,可能在很奇怪的位置

3.递归处理左右两段

 

比较暴力的做法


 

 

 

先开两数组,a,b,然后把<=x放到a数组,>x的放到b数组,然后a数组的数放入q数组,b数组的数放入q数组

 如果忘了如何优雅写快排,就可以这样临时替代一下,虽然双倍空间,但是时间也是线性的

 

优美的做法


 

做法解析


 

基于双指针

 i在左端点开始往右找,j在右端点开始往左找。

i找每个数,如果q[i]<x ,i++,直到q[i]>=x,i停止。j找每个数,如果q[j]>x,j--,直到q[j]<=x,j停止

此时,i,j两个数正好相反,需要交换一下,swap(q[i], q[j]),交换完之后,然后i++,j--,因为两个数排好了

重复此过程,直到i,j相遇,停止

 

为什么是对的?


 

无论任何时刻,i左边的数都是<x的,j右边的数都是>=x的。等到i,j相遇,停止。会完美的划分出左半边<x,右半边>x,满足划分区间的性质

 

特殊求解


 

刚刚都是特殊情况,太抽象了,现在举个例子

数列3 1 2 3 5,假设x=3

i=1,发现3>=3,停止

j=5,发现5>3,j--,j=4,发现3<=3,停止

交换两数,i=2,j=3

 

i=2,1<3,i++,i=3。     2<3,i++,i=4         i=4,发现3>=3,停止

j=3,发现2<=3,停止

 

此时i,j已经穿过了,所以不交换2数

数列变成 3 1 2 3 5

                      j  i

我们发现,发现左边3个数(j)都<=3,右边2个数(i)都>=3

 

写法


 

注意边界问题!!!

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n, a[N];
void quick_sort(int a[], int L, int R)
{
	if (L>=R) return; //边界,区间只有1个数或者没有数就不排序了 
	
	int x=a[(L+R)/2]; //第一步,确定分界点 但是次情况不能取a[R],不然有边界问题,例如n=2, a={1,2},会死循环
	int i=L-1, j=R+1; //两个指针往左右两侧扩一格,跟后面写法有关 
	//原因:因为可以发现,i,j交换完都会移动一位,所以每次不管三七二十一先移动i,j 
	while (i<j) //每次迭代,移动再交换,算一次迭代
	{
		do i++; while (a[i]<x); //位置ok,往后面看 
		do j--; while (a[j]>x); //位置ok,往前面看 
		if (i<j) swap(a[i], a[j]); //需要交换位置了,前提是i<j 
	}
	
	//递归处理左右两边 
	quick_sort(a, L, j);
	quick_sort(a, j+1, R);
}
int main() 
{
	scanf("%d", &n);
	for (int i=1; i<=n; i++) scanf("%d", &a[i]);
	quick_sort(a, 1, n);
	
	for (int i=1; i<=n; i++) printf("%d ", a[i]);
	return 0;
}

  

 

标签:快排,int,交换,--,数组,区间,排序,快速
From: https://www.cnblogs.com/didiao233/p/17986026

相关文章

  • Atlassian 停服 Bamboo,CI/CD 用不了了?教你快速迁移到极狐GitLab CI
    Atlassian表示,将在2024年2月,终止对于旗下所有服务器端产品(Serverproducts)的支持。随着这个时间节点的逐渐临近。那些依赖于私有化部署了Atlassian服务端产品的用户来说,面临着抉择:要么升级到Atliassian的数据中心或者云产品来继续使用Atliasian的产品,要么寻找替代产品......
  • KY207 二叉排序树C++
    考二叉搜索树的插入。#include<iostream>usingnamespacestd;structnode{intdata;structnode*left;structnode*right;};typedefstructnodetree;intmain(){intn;while(cin>>n){tree*root=NULL;while(n!=0......
  • 运用ETLCloud快速实现数据清洗、转换
    一、数据清洗和转换的重要性及传统方式的痛点1.数据清洗的重要性数据清洗、转换作为数据ETL流程中的转换步骤,是指在数据收集、处理、存储和使用的整个过程中,对数据进行检查、处理和修复的过程,是数据分析中必不可少的环节,对于保证数据的质量和可用性具有重要的意义。2.传统方式存在......
  • 逆序对/归并排序
    逆序对定义:对于给定的一段正整数序列,逆序对就是序列中$a_i>a_j$且$i<j$的有序对。P1908逆序对-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e6+10;intn,m,a[N],c[N],res,num;void......
  • 【快速阅读四】基于边缘信息的模版匹配中贪婪度参数的简单解析。
    对这个课题稍作研究,以便记录。在基于边缘的模版匹配中,我们知道可以有个贪婪度参数可以设置。在Halcon的帮助文档中,也有对他进行说明。我们在Halcon那本经典的书上,没有看到对这个参数的解析。不过他也有讲到在计算某个候选位置的得分时,如果满足一定的条件也可以提前结束......
  • 洛谷题单指南-模拟和高精度-P1786 帮贡排序
    原题链接:https://www.luogu.com.cn/problem/P1786题意解读:此题比较简单,模拟+排序即可解决。需要注意的是,当帮贡或者等级相同时,都要保持原来的顺序,因此需要记录每个人的编号,便于排序。话不多说,直接上代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constint......
  • 冒泡排序
    冒泡排序//e.g.设计一个函数实现冒泡排序,将一个整型数组排序voidBubble_Sort(int*arr,intsz)//arr是数组,对数组传参,传的是首元素地址&arr[0]{ //确定bubble排序的趟数 inti=0; intcount=0; for(i=0;i<sz-1;i++) { intflag=1; intj=0; for......
  • 用Java实现冒泡排序:实用教程带你入门
    在处理一些特定系统功能时,经常需要使用冒泡排序。例如,在一个电子商务网站中,需要对商品进行排序和过滤。这个时候可以使用冒泡排序对商品进行排序,以便用户能够按照价格、销量、评分等不同字段进行排序。通过使用冒泡排序,系统可以提供更加灵活和个性化的排序选项,以便用户能够更加方便......
  • Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
    概述在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__(),然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是......
  • 冒泡排序、选择排序、二分查找
    1publicstaticvoidmain(String[]args){2//冒泡排序3//定义一个数组,存储一些数据4int[]arr={5,3,1,2,9,6};5System.out.println("=========冒泡排序==========");6//定义一个循环轮数7fo......