快速排序

今天我要讲的是快速排序的算法,我希望看这篇文章的少年,可以自己去看视频在理解快速排序的基本原理的基础上看这篇文章(不是我不讲基础,而是基础的思想是要有很深刻的理解下明白的)。
快速排序的核心思想就是***

二分法和递归


我们要在乱序中将用一个key(这个key是乱序中的一员),但是我们一般是取key为前,中,后,这三种选法中的一种。我们用二分法将key的左边的数据小于或者等于key,将key的右边的数据大于或等于key。然后,key的右边也进行上面的方法,key的左边也进行上面的方法。我们很容易看去来这是递归算法(***我们看到递归,大脑就要蹦出一个问题,递归的结束条件是什么?不可能一直让计算机执行个百年

我要讲的是key关键字取乱序的前,中这两种的快速排序的方法;

key取乱序的前。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int arry[10000];
void QuickSort(int left,int right)
{
	int key;
   int fakeLeft,fakeRight;
   fakeLeft=left;
   fakeRight=right;
   key=arry[fakeLeft];
   while(fakeLeft<fakeRight)
   {
   	while(arry[fakeRight]>=key && fakeLeft<fakeRight)
	   {
	   	 fakeRight--; 
	   }
	   while(arry[fakeLeft]<=key && fakeLeft<fakeRight)
	   {
	   	   fakeLeft++;
	   }
	   if(fakeLeft<fakeRight)
	   {
             swap(arry[fakeRight],arry[fakeLeft]); 
	   }
   }
   arry[left]=arry[fakeRight];
   arry[fakeRight]=key;
   if(left<(fakeRight-1))
   {
   	QuickSort(left,fakeRight-1);
   }
   if((fakeLeft+1)<right)
   {
   	QuickSort(fakeLeft+1,right);
   }
} 
int main()
{
	int length;
	cin>>length;
	for(int i=1;i<=length;i++)
	{
		cin>>arry[i];
	}
	QuickSort(1,length);
	for(int i=1;i<=length;i++)
	{
		cout<<arry[i]<<" ";
	} 
	return 0;
} 

key取中间

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath> 
using namespace std;
int n,a[1000001];
void qsort(int l,int r)//应用二分思想
{
    int mid=a[(l+r)/2];//中间数
    int i=l,j=r;
    while(i<=j)
	{
        while(a[i]<mid) i++;//查找左半部分比中间数大的数
        while(a[j]>mid) j--;//查找右半部分比中间数小的数
     cout<<"1:   i="<<i<<"    "<<"j="<<j<<endl;
        if(i<=j)//如果有一组不满足排序条件(左小右大)的数
        {
            swap(a[i],a[j]);//交换
            i++;
            j--;
        }
	  cout<<"2:   i="<<i<<"    "<<"j="<<j<<endl;
    }//这里注意要
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	cout<<endl;
    if(l<j) qsort(l,j);//递归搜索左半部分
    if(i<r) qsort(i,r);//递归搜索右半部分
}
int main()
{
    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]<<" ";
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值