解析:
题目背景:
这道题
在分治中
可谓是
经典的要命
理解了的话
不难
可是不理解的话
就是一滩干泥巴
搅都搅不动
这道题
如果想理解
必须画图
否则根本无法理解
图解:
例:输入2,8,1,3,4,6,7,5
中间值等于a[(1+8)/2]
等于a[4]
也就是3
从前往中间寻找比中间值大的数
再从后往中间寻找比中间值小的数
右边没有找到
所以无法交换
向下递归
就好了
难度不高
伪代码详解:
函数(定义 L,R)
{
定义 i,j,mid;
mid=((L+R)/2);
do
{
从左往中间找到比中间值大的数;
从右往中间找到比中间值小的数;
如果(i小于等于j)
{
交换;
i++;
j--;
}
}
while(i小于等于j)
如果(L<j) 递归;
如果(i<R) 递归;
}
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int a[1000];
void qsort(int L,int R)
{
int i=L,j=R,mid=a[(L+R)/2],temp;
do
{
while(a[i]<mid) i++;
while(a[j]>mid) j--;
if(i<=j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
j--;
}
}
while(i<=j);
if(L<j) qsort(L,j);
if(i<R) qsort(i,R);
}
int main()
{
//freopen("ef.in","r",stdin);
//freopen("ef.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
//fclose(stdin);
//fclose(stdout);
return 0;
}
拜拜