一、快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:
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 条评论) |