「改进的快速排序」时间复杂度接近O(n)
来源:互联网 发布:icloud照片怎么导入mac 编辑:程序博客网 时间:2024/06/11 21:30
1.快速排序知识点回顾:
快速排序采用了一种分治的策略,通常称其为分治法(Divide-and-Conquer)。
平均时间复杂度为:O(nlogn)
最好时间复杂度为:O(nlogn), 每次找的基准数最佳,为每个区间的中值。
最坏时间复杂度为:O(n2), 数组递增或者递减。
空间复杂度:快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为 O(lgn), 故递归后所需栈空间为 O(lgn) 。最坏情况下,递归树的高度为 O(n), 所需的栈空间为 O(n) 。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
快速排序代码:
int partition(int arr[], const int& left, const int& right){ if(left < right) { medianAsPivot(arr, left, right); int i = left; int j = right; int key = arr[i]; // 首元素作为pivot while(i < j) { while(i<j && arr[j]>=key) j--; if(i < j) arr[i++] = arr[j]; while(i<j && arr[i]<key) i++; if(i < j) arr[j--] = arr[i]; } arr[i] = key; return i; } return left;}// 快速排序递归实现void quickSort(int arr[], const int& left, const int& right){ if(left < right) { int p = partition(arr, left, right); quickSort(arr, left, p-1); quickSort(arr, p+1, right); }}
2.Kth Largest Element:
http://www.lintcode.com/en/problem/kth-largest-element/
要接近O(n)的解法,必须每次选择区间的中值最为基准值。
void adjustPivot(vector<int> &nums, int left, int right){ int middle = (left & right) + ((left ^ right) >> 1); if(nums[middle] >= min(nums[left], nums[right]) && nums[middle] <= max(nums[left], nums[right])) swap(nums[left], nums[middle]); else if(nums[right] >= min(nums[left], nums[middle]) && nums[right] <= max(nums[left], nums[middle])) swap(nums[left], nums[right]);}int partition(vector<int> &nums, int left, int right){ if(left < right) { adjustPivot(nums, left, right); int pivot = nums[left]; while(left < right) { while(left < right && nums[right] > pivot) right--; if(left < right) nums[left++] = nums[right]; while(left < right && nums[left] <= pivot) left++; if(left < right) nums[right--] = nums[left]; } nums[left] = pivot; } return left;}int kthLargestElement(int k, vector<int> nums){ int size = nums.size(); if(k <= 0 || k > size) return -1; int left = 0; int right = size - 1; while(true) { int position = partition(nums, left, right); if(position < size-k) left = position + 1; else if(position > size-k) right = position - 1; else return nums[size - k]; }}
0 0
- 「改进的快速排序」时间复杂度接近O(n)
- 快速排序改进版,时间复杂度为:O(nk+nlog(n/k))
- 计数排序;非比较排序法;时间复杂度接近于O(n);
- 时间复杂度O(n),空间复杂度O(1)的排序
- 时间复杂度为O(n)的排序
- 时间复杂度为O(n)的排序
- 归并排序、快速排序---时间复杂度为O(nlog n)的排序方式
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 快速排序时间复杂度为O(n×log(n))的证明
- O(N)时间复杂度的排序算法-计数排序
- 快速选择算法(时间复杂度o(n)
- 时间复杂度为O(n+t)的排序
- 时间复杂度为O(n)的排序算法
- 时间复杂度为O(n)的排序算法--计数算法
- 时间复杂度最快的排序算法 O(n) JAVA代码
- 面试9:时间复杂度为O(n)的排序算法
- 基于时间复杂度为O(n)的排序算法
- 排序算法-o(n)时间复杂度
- __stdcall
- 面试题 14
- liunx下swf转换 相关问题____http://bbs.csdn.net/topics/390797316
- 面试题(一)
- spring-boot,jdbc,jsp配置
- 「改进的快速排序」时间复杂度接近O(n)
- XssSniper 扩展介绍
- ubuntu下tcpdump总结
- 将字符串变量转换成临时表
- Android软键盘强制弹出,隐藏输入法.
- json集合字符串转对象
- Python http 请求笔记
- Sping之Bean的生命周期
- JAVA中int与string互转的效率对比