从C语言中我们了解到有个函叫做快速排序函数,我们知道之中排序方法很快,之前我们只是会用,所以今天我们一起学习快速排序的基本思想和实现。
快速的排序的平均时间复杂度为:O(nlog2n),是一种 不稳定的排序方法。
快速排序的基本思想是从数组中取一个值作为基准,把小于基准的数放在左边,大于基准的数放在右边,通过递归细分每一个区间,从而达到排序的效果。
实现的步骤:
从数组的两端开始访问,第一、从右边往左开始不遍历比基准小的数,有则,停下,没有继续往左;第二步、从左到右遍历比基准大的数,有则停下,没有则继续往右(这些都是基于两边访问还没有访问到,相同的数的前提下),直到两个都停下来,而且两个下标不一样就直接交换两个数,直到两个下标相同,则把基准作为当前的位置的值。
例如:有数组 int a[5]={2,8,7,5,6,1};
取第一个为基准,2
int i,j; 把 i从左边到右移动,把j从右到左移动
先判断j,a[j]=1小于基准,停下。
第二步,判断i,i=2,交换两值
得到1,8,7,5,6,2
继续往前
j--;a[j]=6大于基准2停下, i++,a[i]=8,也大于基准,交换两值
得1,6,7,5,8,2
继续,直到i=j=2,交换基准得a[2]=2,递归基准左边的区间和基准右边的区间
得到1,2,5,6,7,8
关键代码:
inline void adjustarr(int arr[],int left,int right)
{
if(left>right) return;
int i=left;
int j=right;
int x=arr[left];
while(i!=j)
{
while(i<j&&arr[j]>=x)
j--;
while(i<j&&arr[i]<x)
i++;
//把比x小的放在i的左边,比x大的放在右边,这里用交换
Myswap(arr[i],arr[j]);
}
Myswap(arr[i],x);
//继续处理i左边和i右边的
adjustarr(arr,left,i-1);
adjustarr(arr,i+1,right);
}
对于20000个数据的执行情况如下: