快速排序

来源:互联网 发布:贝克汉姆任意球数据 编辑:程序博客网 时间:2024/05/17 23:13
首先:我们要明白快速排序的原理!
1.我们一般选择数组的第一个元素来进行比较,这样可以方便我们递归调用。
2.首先设置一个Temp变量,然后从数组的最后一位向前移动,即找到一个小于Temp的数s[j],然后这个数就放入第一个位子
3.然后在从前到后寻找第一个大于等于Temp的数s[i],然后将上一步多出来的数s[i]放入s[j]的位置。
4.这样循环结束后Temp(原数组的第一个数)放入s[i]中,这样之后就表示在Temp的左边都是比Temp小的,而在右边则是大于Temp的数。
5.最后递归调用,完成整个数组的排序
void quick_sort(int s[], int l, int r){    if (l < r)    {                       int i = l, j = r, Temp = s[l];        while (i < j)        {            while(i < j && s[j] >= Temp) // 从右向左找第一个小于Temp的数                            j--;             if(i < j)                            s[i++] = s[j];                                while(i < j && s[i] < Temp) // 从左向右找第一个大于等于Temp的数                            i++;             if(i < j)                            s[j--] = s[i];        }        s[i] = Temp;        quick_sort(s, l, i - 1); // 递归调用        quick_sort(s, i + 1, r);    }}
时空复杂度分析:快排每次将排序数组分为两个部分,理想状况下,每一次都 将待排序数组划分成两个部分则需要logN次划分。而在最坏情况下,即数组已经有序或是大致有序的情况下,每次划分只能减少一个元素,快速排序将不行变成了冒泡排序,所以快速排序时间复杂度下界为O(NlogN),而最坏的情况为O(n^2),在实际的应用中快排的平均时间复杂度为O(NlogN)

原创粉丝点击