今天我要讲的是快速排序的算法,我希望看这篇文章的少年,可以自己去看视频在理解快速排序的基本原理的基础上看这篇文章(不是我不讲基础,而是基础的思想是要有很深刻的理解下明白的)。
快速排序的核心思想就是***
二分法和递归
我们要在乱序中将用一个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;
}