八大排序学习之六快速排序

来源:互联网 发布:windows键的用途 编辑:程序博客网 时间:2024/04/30 14:54

从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个数据的执行情况如下:






0 0
原创粉丝点击