快速排序总结
2015-08-05 09:21
337 查看
快速排序是相当重要的一种排序方法。它的特点有:
1. 平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)。
2. 平均空间复杂度为O(logn),最坏空间复杂度为O(n)。
3. 不稳定
快排的实现方法有多种,这里只列出常用的两种。
单向扫描版:
双向扫描版:
主调用:
递归是实现快排的主要策略。当然也可以非递归实现快排。
快排非递归版:
参考文档:
1. 平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)。
2. 平均空间复杂度为O(logn),最坏空间复杂度为O(n)。
3. 不稳定
快排的实现方法有多种,这里只列出常用的两种。
单向扫描版:
int partition(int arr[], int p, int r) { int x = arr[r]; int i = p - 1; for (int j = p; j < r; ++j) { if (arr[j] <= x) { ++i; swap(arr[i], arr[j]); } } swap(arr[i+1], arr[r]); return i + 1; }
双向扫描版:
int partition(int *a,int p,int r) { int i = p,j = r; int x = a[p]; while (i < j) { while (i < j && a[j] >= x) j--; if (i < j) a[i++] = a[j]; while (i < j && a[i] <= x) i++; if (i < j) a[j--] = a[i]; } a[i] = x; return i; }
主调用:
void QuickSort(int *a,int p,int r) { if (p<r) { int q = partition(a,p,r); QuickSort(a,p,q-1); QuickSort(a,q+1,r); } }
递归是实现快排的主要策略。当然也可以非递归实现快排。
快排非递归版:
void quicksortIterative(int arr[], int s, int e) { stack<int> stk; stk.push(s); stk.push(e); while (!stk.empty()) { int end = stk.top(); stk.pop(); int start = stk.top(); stk.pop(); int mid = partition(arr, start, end); if (start < mid - 1) { stk.push(start); stk.push(mid - 1); } if (mid + 1 < end) { stk.push(mid + 1); stk.push(end); } } }
参考文档:
快速排序-递归和非递归的实现
相关文章推荐
- Android Studio导入GitHub上的项目常见问题(以图片轮播开源项目为实例)
- 南邮 OJ 1135 Missile
- 南邮 OJ 1133 搜索(三)
- hdu 1969
- 流量水波浪效果,超级炫酷暖人
- 基本数据结构和算法回顾
- zoj 2100Seeding(dfs+回溯)
- 玩javaweb的web.xml编译路径
- No system images installed for this target
- dm8148 HDVPSS 知识简介
- JDK,JRE,JVM
- C++ 智能指针详解
- iOS7使用iOS8上的方法报错处理
- Editplus notepad++ Gedit UltraEdi对比
- 在Windows8下安装SQL Server 2005无法启动服务
- 《深入理解Nginx》笔记之 HTTP请求的11个处理阶段
- python os
- C++之归并排序
- 多线程的基本概念
- 1057. Stack (30)五种解法总结(大杂烩)