快速排序
时间:2022-04-22
本文章向大家介绍快速排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
平均时间O(NlogN),最坏O(N^2)
主要过程四步:
1 如果S中元素为1 或者 0 ,直接返回
2 取S中的任一元素v,称为 枢纽元
3 将集合按照 枢纽元大小 分成两个集合
4 两个子集合递归调用2 - 3
选取枢纽元方法:
1错误方法:直接选取第一个
2安全方法: 随即选取一个枢纽元
3三数中值分割法:选取数组的中值
主要代码:
1 #include <iostream>
2 #include <vector>
3 using namespace std;
4 template <typename Comparable>
5 void quicksort( vector<Comparable> & a)
6 {
7 quicksort(a,0,a.size()-1);
8 }
9 template <typename Comparable>
10 const Comparable & median3(vector<Comparable> & a,int left,int right)
11 {
12 int center = (left + right)/2;
13 if(a[center] < a[left])
14 swap(a[left],a[center]);
15 if(a[right] < a[left])
16 swap(a[left],a[right]);
17 if(a[right] < a[center])
18 swap(a[center],a[right]);
19
20 swap(a[center],a[right - 1]);
21 return a[right-1];
22 }
23 template <typename Comparable>
24 void quicksort( vector<Comparable> & a,int left,int right)
25 {
26 if(left + 10 <= right)
27 {
28 Comparable pivot = median3(a,left,right);
29
30 int i=left,j=right-1;
31 for( ; ; )
32 {
33 while(a[++i] < pivot){}
34 while(pivot < a[--j]){}
35 if(i<j)
36 swap(a[i],a[j]);
37 else
38 break;
39 }
40 swap(a[i],a[right-1]);
41 quicksort(a,left,i-1);
42 quicksort(a,i+1,right);
43 }
44 else
45 insertionSort(a,left,right);
46 }
47 /*template <typename Comparable>
48 void insertionSort(vector<Comparable> & a)
49 {
50 int j;
51 for(int p = 1;p<a.size();p++)
52 {
53 Comparable tmp=a[p];
54 for(j=p;j>0 && tmp<a[j-1];j--)
55 a[j]=a[j-1];
56 a[j]=tmp;
57 }
58 }
59 template <typename Iterator,typename Comparator>
60 void insertionSort(const Iterator & begin,const Iterator & end,Comparator lessThan)
61 {
62 if(begin != end)
63 insertionSort(begin,end,lessThan,*begin);
64 }
65 template <typename Iterator,typename Comparator,typename Object>
66 void insertionSort(const Iterator & begin, const Iterator & end , Comparator lessThan,const Object & obj)
67 {
68 Iterator j;
69 for(Iterator p =begin+1;p != end;++p)
70 {
71 Object tmp = *p;
72 for(j=p; j!=begin && lessThan(tmp,*(j-1)); --j)
73 *j = *(j-1);
74 *j = tmp;
75 }
76 }*/
77 int main()
78 {
79 vector<int> ivec;
80 ivec.push_back(1);
81 ivec.push_back(9);
82 ivec.push_back(2);
83 ivec.push_back(10);
84 ivec.push_back(3);
85 ivec.push_back(11);
86 ivec.push_back(4);
87 ivec.push_back(12);
88 ivec.push_back(5);
89 ivec.push_back(13);
90 ivec.push_back(6);
91 ivec.push_back(14);
92 ivec.push_back(7);
93 ivec.push_back(15);
94 ivec.push_back(8);
95 ivec.push_back(16);
96 quicksort(ivec);
97 for(int j = 0;j<ivec.size();j++)
98 cout<<ivec[j]<<endl;
99 return 0;
100 }
代码执行中,因为没有insertionSort,所以暂时执行不了,insertionSort是插入排序,这样可以减少时间的消耗。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyQt5 技术篇-Dialog窗口增加?问号按钮
- python课题:正弦函数 求圆形的阴影面积
- 华为学习笔记(SSM框架报错篇)
- Python通讯录作业
- 振兴杯试题分析:制作简单的登陆页(一)
- Python作业:BMI评估
- Python笔记
- JavaScript 技术篇-chrome利用ClipboardEvent写入剪切板,没成功的你就差一步
- 搭建一个高可用负载均衡的集群架构(第三部分)
- C语言学习笔记
- JavaScript 技术篇-js获取窗口标题名,获取页面URL地址
- Pyhon海龟绘制木叶村徽章
- MIT大神写给女神的Q版Python画图库—Cutecharts【技术创作101训练营】
- JavaScript 技术篇-js创建dom节点,并设置属性
- 容器中的数据管理