大一细谈算法-快速排序-笔记

排序

sort()基本使用方法
 sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。如果我们想从大到小排序可以将cmp参数写为greater()就是对int数组进行排序,当然<>中我们也可以写double、long、float等等。如果我们需要按照其他的排序准则,那么就需要我们自己定义一个bool类型的函数来传入。比如我们对一个整型数组进行从大到小排序:

#include
#include
using namespace std;

int main(){
	int num[10] = {6,5,9,1,2,8,7,3,4,0};
	sort(num,num+10,greater());
	for(int i=0;i<10;i++){
		cout<

快速排序

在一串数字当中,长度为    左端点------------------------------------------------------------------右端点

1.确定分界点:确定中间值,确定左右端点,随机数   x

2.调整区间:小于等于x在左边,大于等于在右边   (最重要)

3.递归:递归处理左右两边分别排序,整个区间排好序了

例如

1.两个数组  a[],b[];

2.扫描区间所有的数,如果大于x就放到右边,小于x就放到左边

3.最后把两个数组的数全部放到区间里面,就全部排序好了


若不开辟空间就可以分配两边呢呢?  指针分配空间,左边小右边大

设两个指针,i,j分别放到左右两端 ,两个指针同时往中间走,如果i小于x肯定最终在左半边,一直移动之后,某一个值大于x的时候,应该移动到右边,j也是一样的,直到i指向的数应该是右边,j是左边,所以将两个数swap,直到i和j相遇,就把区间一分为二了

i之前的数一定小于x,j之后的数一定大于x


例题:3 1 2 3 5 一串数字当中,设x=3

首先将指针i指向3,j指针指向5,此时j已经等于x=3,j是5,那么j移动到下一个3,我们将两个数字交换

其次i移动指向1,满足小于3,指向2,满足小于3,到了3的时候,停下来,j的时候移动到2,不满足大于3,停下来,此时已经错过没有合并,所以不满足

此时分开两个组,3 1 2                   /             3 5 

然后分开继续排列


模板

#include
using namespace std;
const int N=1e6+10;
typedef long long ll;
ll q[N];int n;
void quick_sort(int l,int r){
    if(l>=r) return;
    ll x=q[(l+r)>>1];
    int i=l-1,j=r+1;
    while(ix);
        if(i

你可能感兴趣的:(笔记,学习笔记,快速排序)