目录
一、百度
1、百度百科----分治思想
https://baike.baidu.com/item/%E5%88%86%E6%B2%BB/3029637?fr=ala
分治思想的条件和设计步骤
2、快速排序
快排是在冒泡排序之上改进的
3、动态图
二、Acwing ----Y神
方法一
1、确定分界点
其中x=q【(l+r)/2】。
2、调整区间
其中让小于x的排到左边,让大于x的排到右边。注意y点不是正中间的点。
3、递归处理两边
注意:最重要的不足就是处理第二步:调整区间。
(1)先开辟两个数组
(2)q【l---r】区间 ,把小于等于x的放进a【】中,把大于x的放进b【】中。
(3)再把a,b放进q【】中。
方法二
双指针调整区间。让指针分别从最左边和最右边开始遍历,如果指针分别大于x,小于x,交换两指针,如此方法,直到指针相遇。
其余步骤依然按照方法一。
!!!注意。这种问题都是有边际的,请注意!
三、代码和模板
Acwing 785
#include<iostream>
using namespace std;
const int N=1000010;
int n;
int a[N];
void quick_sort(int a[],int l,int r)
{
if(l>=r) return;
int i=l-1,j=r+1,x=a[(l+r)/2];
while(i<j)
{
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
quick_sort(a,0,n-1);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
void qsort(int l,int r)
{
int i=l,j=r,mid=x[(l+r)/2];
do
{
while(x[j]>mid)
j--;
while(x[i]<mid)
i++;
if(i<=j)
{
swap(x[i],x[j]);
i++;
j--;
}
}
while(i<=j);
//快排后数组被划分为三块: l<=j<=i<=r
if(k<=j) qsort(l,j);//在左区间只需要搜左区间
else if(i<=k) qsort(i,r);//在右区间只需要搜右区间
else //如果在中间区间直接输出
{
printf("%d",x[j+1]);
exit(0);
}
}
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
qsort(0,n-1);
}
学习日志:
1、c++中scanf比cin的输入快,尤其是在大、多的数据的时候。
2、我是在codeblocks中写了一个c++代码,出现的这个问题也是有点莫名其妙,因为没有编译错误也没用运行时错误,就是直接退出。
初始化了一个相当大的数组,导致内存溢出,从而导致整个函数(即便是在初始化这个数组之前的代码)未执行,并导致整个程序直接退出!
但是!!!这里的重点不在于定义了一个相当大的数组,而在于内存溢出!临时变量放到堆栈里,堆栈比变量小,就是你说得不能运行。实际上是堆栈溢出。