首页 > 其他分享 >快速排序

快速排序

时间:2023-07-01 17:23:20浏览次数:37  
标签:arr end int 复杂度 begin while 排序 快速

  没想到再次回顾快排发现自己对于快排的理解还不是很深入。

  这是Acwing中模板题

  快排的时间复杂度为O(nlogn) ~ O(n^2);

     若用《数据结构(C语言版)》中的算法:

    【代码解析】

void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

每次以第一个数据为参照数,则在数组为逆序时的时间复杂度为O(n^2),递归次数为n-1,而最好的时候(平均递归),递归次数为logn,每次遍历次数都为n。

 

  但是这样子写,在Acwing会被卡,所以有了优化代码:

void quick_sort(int f[],int l, int r)
{
    if(l >= r) return;
    
    int i = l - 1, j = r + 1, x = f[l + r >> 1];
    while(i < j)
    {
        do i ++; while (f[i] < x);
        do j --; while (f[j] > x);
        if(i < j) swap(f[i],f[j]);
    }
    
    quick_sort(f , l, j);
    quick_sort(f , j + 1, r);
}

这里面的参照数是随机选取的(取的数组中心值),所以在最坏情况下的时间复杂度要小于O(n2)。

 

标签:arr,end,int,复杂度,begin,while,排序,快速
From: https://www.cnblogs.com/Geniw/p/17519515.html

相关文章

  • Redis数据结构——快速列表(quicklist)1
    Redis数据结构——快速列表(quicklist)一、什么是quicklistquicklist是Redis3.2版本以后针对链表和压缩列表进行改造的一种数据结构,是zipList和linkedList的混合体,相对于链表它压缩了内存。进一步的提高了效率。quicklist其实就是简单的双链表,但每个双链表节点中保存......
  • Redis数据结构——快速列表(quicklist)
    Redis数据结构——快速列表(quicklist)一、什么是quicklistquicklist是Redis3.2版本以后针对链表和压缩列表进行改造的一种数据结构,是zipList和linkedList的混合体,相对于链表它压缩了内存。进一步的提高了效率。quicklist其实就是简单的双链表,但每个双链表节点中保存......
  • python的sort函数与sorted函数排序
    1.sort函数sort函数为python内置的列表排序高阶函数,所谓高阶函数,也就是参数为函数或返回值为函数。先看个简单的例子:# 数字列表的排序示例nums=[5,2,9,1,7]nums.sort()print(nums)#输出:[1,2,5,7,9]可以发现排序后,改变了原列表的顺序。而且sort......
  • 八大排序算法——快速排序
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1000010;intn;intq[N];voidquick_sort(intl,intr)//快速排序{if(l>=r)return;inti=l-1,j=r+1,x=q[(l+r......
  • 快速使用Python-Tkinter设计界面 方法与代码
    作者:干饭小熊猫链接:https://www.zhihu.com/question/68663671/answer/2519875621来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1简介1.1Tkinter是什么?Tkinter是Python自带的GUI库,Python的IDEL就是Tkinter的应用实例。Tkinter可以看作是Tk......
  • 参考资料------ 快速使用Python-Tkinter设计界面 方法与代码-20230701
    作者:干饭小熊猫链接:https://www.zhihu.com/question/68663671/answer/2519875621来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1简介1.1Tkinter是什么?Tkinter是Python自带的GUI库,Python的IDEL就是Tkinter的应用实例。Tkinter可以看作是Tk......
  • 如何快速截图、拉红框、红箭头
    ​一、如何快速截图方法1(windows自带截图工具):第一步:同时按住键盘上的“Shift”、"​win”和“S”【即Shift+win+S】,则会出现下图中的画面: 第二步:这个时候框选住你需要的画面之后,会在右下角弹出以下弹窗:第三步:点击这个弹窗,则会出现“截图和草图”窗口:  第四步:点“保存......
  • Linux必学技能 | 17个案例带运维小白快速精通Awk命令,拿来即用
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行地读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。之......
  • 冒泡、选择、插入、归并、快速排序代码
    importrandom#随机生成包含10个元素的数组random.seed(10)alist=[random.randint(1,100)for_inrange(10)]冒泡排序'''冒泡排序每轮相邻的两个元素,两两相比,此轮最大的元素,像泡泡一样移动到队列尾部。每次j和j+1位置比较,胜者冒出去'''defbubble_sort(arr)......
  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排)
    ✔️前言......