快速排序是一种最常用的排序,速度快,占用空间少
常用排序算法速度比较动图https://www.toptal.com/developers/sorting-algorithms/
假设我们现在要对”6,1,2,7,9,3,4,5,10,8”这10个数进行排序。首先在这个序列中随便找一个数作为基准数(就是一个用来参照的数)。为了方便,就使用第一个数字6作为基准数。然后,所有比基准数大的数放在6的右边,比基准数小的数放在6的左边。
方法是,在序列的两端开始“探测”。先从右往左找一个比6小的数,再从左向右找一个比6大的数,然后交换他们。这里可以用两个变量i和j(给他们起个名字叫哨兵i和哨兵j),分别指向序列的最左边和最右边。刚开始时,哨兵i指向序列最左边(即i=1)的数字6。让哨兵j指向序列最右边(即j=10)的数字8。
用一张图来表示(来自啊哈!算法)
重复图片中的步骤,直至排序结束。
实际上,快速排序采用的方法是“二分”的思想,即所说的递归的思想。
快排在c中的表示
#include <stdio.h>
int a[101],n;//全局变量,这连个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,temp,t;
if(left>right)
return ;
temp=a[left];//基准数
i = left;
j = right;
while(i!=j)
{
//顺序很重要,要先从右往左找
while(a[j]>=temp && i<j)
{
j--;
}
//在从左往又找
while(a[i]<=temp && i<j)
i++;
//交换两个数的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
quicksort(1,n);
for(i=1;i<n;i++)
{
printf("%d ",a[i]);
}
}
运行结果