排序算法——快速排序

来源:互联网 发布:corel软件包括 编辑:程序博客网 时间:2024/05/22 13:12

快速排序是对冒泡排序的一种改进。为什么这么说呢?想一下冒泡排序,我们是把轻的往上面冒,参照的是某一个位置上的,这个位置是我们认为规定的从底部依次往上数。而快速排序的这个位置是我们随机选择的或者选中间,选取方法也是一种算法,算法书上有介绍。然后拿这个位置上的元素作参照,比他大就往下沉,比他小就往上升。然后再交换元素。所以它也是基于交换元素的。然后它还是递归的。


说到这个算法我觉得我应该想到百度2011年的笔试题,其中有一个排石头的题目,只有天平,而不能计算出石头的实际重量,只能通过比较来排序。那么这个就是一个快速排序的典例。


快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


算法的时间复杂度是:快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要logn次划分。

而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。
下面是我写的一个程序:
void quickSort(int* a,int left,int right){if(left>=right)return;int i = left;int j = right;int mid = (left+right)/2;int key = a[mid];//随机选取中间元素while(1){//从两边选取可以交换的元素并且实现交换while(a[j]>key)j--;while(a[i]<key)//i和j的值在这里有可能重合,所以不能加上=i++;if(i>=j)break;//选取交换元素的程序停下来然后进行交换int tmp = a[i];a[i] = a[j];a[j] = tmp;}//递归调用quickSort(a,left,j);//思考为何这里选jquickSort(a,j+1,right);}

原创粉丝点击