首页 > 生活

快速排序算法

更新时间:2025-05-23 02:48:32 阅读: 评论:0

朝代历史

一、快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:

1、从数列中取出淘宝代理货源网一个数作为基准数(枢轴,pivot)。

2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。

3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。

快排最重要的一步就是划分了。划分的过程用通俗的语言讲就是“挖坑”和“填坑”。

快速排序时间复杂度

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。

(01) 为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。

因此,快速排序的遍历次数最少是lg(N+1)次。

假睫毛胶水(02) 为什么最多是老巴斯N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最献血的危害多是N次。雷霆战将

快速排序稳定性

快速排序是不稳定的算法,它不满足稳定算法的定义。

算法稳定性 -- 假设在数列中存在a樱花任务[i]=a[j],若在排序之前,a[i]在a[j]前面谷歌卫星;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

二、快速排序算埃及总统法流程如下:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

(2)将大于等于分界值的数据集中到数组右边,小于世间所有的相遇都是久别重逢分界值的数据集中到数组的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

三、例子

int partition(int arr[], int left, int right) //找基准数 划分 { int i = left + 1 ; int j新年壁纸 = 格瓦斯饮料right; int temp = arr[left]; while(贷款顾问i <= j) { while (arr[i] < temp) 张子强电影 { i++; } 3004while (arr[j] > temp ) { j程序人生--; 桂江一中 } if (i < j) swap(arr[i++], arr[j--]); else i++; } swap(arr[j], arr[left]); return j; } void qui世外小学ck_sort(i喻嘉言nt arr[], int left, int right) { if (left > right) return; int j = partition(arr, left, right); quick_sort(arr, left, j - 1); 基础医学知识 quick_sort(arr, j + 1, right); }

本文发布于:2023-06-05 06:04:23,感谢您对本站的认可!

本文链接:http://www.ranqi119.com/ge/85/224431.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   快速
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26|友情:优美诗词|电脑我帮您|扬州装修|369文学|学编程|软件玩家|水木编程|编程频道