快速排序
来源:互联网 发布:七月算法tensorflow 编辑:程序博客网 时间:2024/06/03 19:52
算法原理
快速排序(Quick Sort)算法的原理如下:
快速排序通过对无序向量进行处理,得到轴点(Pivot)或基准点,再通过轴点将原无序向量划分为两个子无序向量,从而不断减小问题规模。
轴点:在任一向量S中,对某一元素p = S[i],若其满足:
(1)在其之前的元素严格小于p;
(2)在向量S中,恰有i-1个元素不大于p;
则我们称p=S[i]为S的轴点。
很显然,当我们找到一个无序向量的一个轴点时,我们可以以轴点为分界点,划分出两个子向量S1,S2。此时,S1内的元素完全小于轴点,S2内的元素完全不小于轴点。故此时轴点与解无关,从而减小问题规模。
假设原无序向量为S,排序后的有序向量为S’,则轴点如下性质在S、S’中不会发生改变:
(1)轴点的秩
(2)轴点前驱的最大秩
(3)轴点后驱的最小秩
快速排序与归并排序类似,都是通过分治策略进行排序,而快速排序与归并排序的不同之处在于,快速排序可以在O(1)时间里由子问题的解得到原问题的解,但是将原问题分解为子问题却需要O(n)时间,此外,快速排序分解子问题时,往往子问题的规模不一致,甚至有可能出现,子问题与原问题规模一致的最坏情况。
算法分析
快速排序主要难点在于基准的选取,而基准的选取方式往往有多种选择,一般可以选取首位元素,中位元素,末尾元素,还有常见的三数取中法(即先对首中末三个元素进行排序,再选取中位元素进行快排)
快速排序的平均时间复杂度为:O(NlogN),但是存在最坏情况时,时间复杂度则可能为O(N^2),故建议使用三数取中法,尽量防止最坏情况出现。
Code:
#include <iostream>using namespace std;int input[1000];void swap(int & a,int & b){ int tmp = a; a = b; b = tmp; return ;}int Find(int begin, int end, int * data){ int mid = (begin+end)/2; int tmp[3] ={begin,end,mid}; if (data[tmp[0]]>data[tmp[1]]) swap(tmp[0],tmp[1]); if (data[tmp[1]]>data[tmp[2]]) swap(tmp[2],tmp[1]); if (data[tmp[0]]>data[tmp[1]]) swap(tmp[0],tmp[1]); return tmp[1];}int Find_Pivot(int begin, int end, int *data){ int index = 0; if (end-begin < 2) index = begin; else index = Find(begin,end,data); swap(data[index],data[begin]); int key = data[begin], i = begin, j = end; while (i < j) { while (i < j && data[j] <= key) j--; data[i] = data[j]; while (i < j && data[i] >= key) i++; data[j] = data[i]; } data[i] = key; return i;}void Quick_Sort(int begin, int end, int * data){ if (end-begin < 1) return ; int pivot = Find_Pivot(begin,end,data); Quick_Sort(begin,pivot-1,data); Quick_Sort(pivot+1,end,data);}int main(){ int N; cin>>N; for (int n = 0; n < N; n++) cin>>input[n]; Quick_Sort(0,N-1,input); return 0;}
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- HihoCoder 1078(线段树,区间覆盖 询问区间和)
- Java动态代理和CGLIB代理
- 算法1.4背包(algs4)
- linux下如何使用c导入txt文件进行mysql数据库操作
- 微信支付回调效验签名
- 快速排序
- 关于ANT指定系统工程编译JDK的设置
- 微信小程序中调用page中自定义的函数
- Vim配置
- 【笔记+模板】图论 持续更新中
- join()方法
- 频道管理
- STL-string的用法
- JS 阻止点击事件