快速排序(代码+图解)
快速排序就是先根据一个值,把小于它的放在一边,大于它的放在另一边,自己在中间
然后两边再进行快排,需要进行排序的无序数组长度为1则停止
下面是以最后一个数98为例进行的一次快排
快排图解
代码
#include<bits/stdc++.h>
using namespace std;
void show(int a[],int n)//显示
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void change(int &a,int &b)//两个数交换赋值
{
int t=a;
a=b;
b=t;
}
void sortFast(int a[],int l,int r)//快速排序
{
if(l>=r) return ;
int start=l,end=r;
int target = r;
while(l<r)
{
while(a[l]<a[target])
{
l++;
}
if(l<r)
{
change(a[l],a[target]);
target=l;
}
while(a[r]>=a[target])
{
r--;
}
if(l<r)
{
change(a[r],a[target]);
target=r;
}
}
sortFast(a,start,l-1);//递归快排左侧
sortFast(a,l+1,end);//递归快排右侧
}
void sortFast(int a[],int l,int r)//改进版
{
if(l>=r) return ;
int start=l;
int end =r;
int base = a[end];
while(l<r)
{
if(l<r && a[l]<=base) l++;
if(l<r && a[r]>=base) r--;
int tmp=a[l];
a[l]=a[r];
a[r]=tmp;
}
a[end]=a[l];
a[l]=base;
sortFast(a,start,l-1);
sortFast(a,l+1,end);
}
int main()
{
int arr[]={290,662,307,997,151,423,890,717,640,703,566,883,661,659,245,386};
int len = sizeof (arr)/sizeof (arr[0]);
sortFast(arr,0,len-1);
show(arr,len);
}
查看3道真题和解析