快速排序,顾名思义就是能有效加快排序速度,提高代码效率的排序方法。在日常做题的过程中有时会碰到数据量巨大,插入排序、冒泡排序、选择排序都无法在规定的时间内完成的排序问题。
在快速排序中,我们需要在数组中随机寻找一个“标志数”,将全部大于此数的与全部小于“标志数”的分列该数的两端,然后根据“标志数”分开,再分开的这两段数中再次寻找随机的“标志数”,再次进行分类,以此类推,知道不可分割为止,此时这个无序数列就变得有序。
总的来说,快速排序就是运用递归的思想,将一段无序的数列利用“标志数”逐渐分成若干个子数列,类推得到若干个有序子数列,最终得到一个完整的有序数列的过程。
在代码实现快速排序的过程中,对于考虑“标志数”应该取数组中的哪一位,其实仔细一想“标志数”无所谓在数组的哪一位,因为实际上“标志数”的位置并不影响代码的运行以及排序,位置会通过影响分成的子数列的数量不同,进而影响到排列成有序数列的时间。
最重要的是而如何实现将“标志数”一端分别放上比该数大的数,另一端放上较“标志数”少的数并实现递归。
从数列左边找到第一个大于“标志数”的数字(以升序排列为例),再从数列右边找到第一个比“标志数”小的数,进行交换。
快排函数
void seq(int a[],int n,int m)
{
int x=n,y=m,flag=a[(n+m)/2],temp;
do//实现寻找“标志数”两端第一个大于、小于的数值并进行交换
{
while (a[x]<flag)x++;
while (a[y]>flag)y--;
if(x<=y)
{
swap(a[x],a[y]);
x++;
y--;
}
}
while(x<=y);
if(n<y) seq(a,n,y);//递归调用实现快速排序。
if(x<m) seq(a,x,m);
}
将代码封装在一个函数体中。
在主函数中只需调用函数即可实现快排:
#include <iostream>
using namespace std;
void seq(int a[],int n,int m)
{
int x=n,y=m,flag=a[(n+m)/2],temp;
do
{
while (a[x]<flag)x++;
while (a[y]>flag)y--;
if(x<=y)
{
swap(a[x],a[y]);
x++;
y--;
}
}
while(x<=y);
if(n<y) seq(a,n,y);
if(x<m) seq(a,x,m);
}
int main()
{
int b[5];
for(int i=0;i<5;i++)
{
cin>>b[i];
}
seq(b,0,4);
for(int i=0;i<5;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
这里以内容5个数据的数组为例,运行结果:
Last login: Sat Mar 19 22:08:24 on ttys000
1 4 3 2 5
1 2 3 4 5
i@HUAWEI-MateBook-X-Pro ~ %