您的位置:首页 > 其它

EOJ 1807 快速排序

2016-12-27 20:20 148 查看
#include <iostream>
#include <stack>
#include <vector>
#include <deque>
#include <string>
#include <math.h>
#include<stdlib.h>
#include<stdio.h>
void qsort(int a[],int low, int up)
{
int i,j;
int t;
if(low<up)//low<up时才有效
{
i=low;//令i,j分别取此时的最高位和最低位
j=up;
t=a[low];//t存储最低位的值
while(i!=j)//当i和j不相等时
{
while(i<j&&a[j]>t)//当i<j并且a[j]比t大,则j一直向前走
j--;
if(i<j)a[i++]=a[j];//如果a[j]<=t,那么将a[j]赋值给a[i],并且i+1
while(i<j&&a[i]<=t)//当a[i]<=t时,排序正常,则i继续向下走
i++;
if(i<j) a[j--]=a[i];//当a[i]>t时,不正常,则将此值赋给a[i],并且j向前移动
}
a[i]=t;//当i和j相等时,将t赋值给a[i]
qsort(a,low,i-1);//左右递归
qsort(a,i+1,up);
}
}
int main()
{
int n,a[20005];
scanf("%d",&n);//共有n个元素待排序
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,0,n-1);//调用qsort函数
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}

快速排序的思想是取待排序的结点序列中某个结点的值作为控制值,采用某种方法把这个控制值放在适当的位置,使得这个位置的左面的所有的结点的值都小于等于这个控制值,而这个位置的右面的所有结点的值都大于这个控制值。注意方法的要点事“多次划分,多次递归"。每次递归注意他的low和up位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: