快速排序 -《自学笔记》

//从小到大的快速排序

#include<iostream>
using namespace std;
int a[10005],n;
void Quick_Sort(int start, int end) 
{   
	if(start>=t)                         //如果相等就只有1个元素待排  返回
	{                                    //起始元素下标 大于 末尾元素下标 越界返回
		return;                          
	} 
	int p=a[start],k=end,l=start,r=end;  
   //p变量储存区间第一个元素作为对照 k来判断每次该移左端点还是右端点
   //因为开始判断的是区间第一个元素,所以从右端点开始判断,利于交换
   //s和e会用于后续传参,所以用l,r分别储存 

	while(l!=r)            // 左右端点不重合时进行排序
	{                      //判断是该从右边取数判断 还是从左边取数判断
		if(k==r)           //如果k=r从右取数   
		{
		  if(a[r]>=p)      //如果右边的数已经大于等于对照数
	      {
	   	    r--;           //则放置区间正确,向前取数继续判断
	   	    k=r;
	      }
          else             //如果右边的数比对照数小
	      {
	   	   a[l]=a[r];      //应该交换到对照数前的区间,存到数组下标为l的位置
	 	   l++;            //l位置存放好正确的数,l向后移动一位   
                           //这样数组的a[r]元素已经放置到正确的区间         
           k=l;            //后续交换时a[r]位置的数就可以被替换,准备从l位置取数判断
	      }	
		}
		else               //否则k=l,从左取数 
		{
		  if(a[l]<=p)      //如果左边的数已经小于等于对照数
	      {
	   	    l++;           //则放置区间正确,向后取数继续判断
	   	    k=l;
	      }
          else             //如果左边的数比对照数大
	      {
	   	    a[r]=a[l];     //应该交换到对照数后的区间,存到数组下标为r的位置
	   	    r--;           //r位置存放好正确的数,r向前移动一位  
	   	                   //这样数组的a[l]元素已经放置到正确的区间
            k=r;           //后续交换时a[l]位置的数就可以被替换,准备从r位置取数判断
	      }	 
		}
	}                      //当l=r时,r前都是小于对照数的数,r后都是大于对照数的数
	a[r]=p;                //a[l]或a[r]位置就可以存放对照数,对照数位置确定为a[l]或a[r]
    Quick_Sort(start,r-1); //对 对照数前的区间进行相同操作,对照数前区间为[start,r-1]
    Quick_Sort(r+1,end);   //对 对照数后的区间进行相同操作,对照数前区间为[r+1,end]
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	Quick_Sort(1,n);//(该区间起始元素下标,末尾元素下标)
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值