【Sort】QuickSort
快速排序,平均运行时间O(N log N),最坏运行时间O(N^2)。
我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解。
整体思路:
首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部
分利用快排。
具体细节:
1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,严重影响排序效率。
为了尽可能消除这种影响,同时取数组中的索引为0,n-1,和中值中的中间值作为pivot。产生pivot的时候,0,n-1
位置上的值已经满足pivot的要求,所以排序时候不需要再考虑,所以把pivot的值保存再n-2位置上。
2.为了把数组划分为两部分,利用双指针i,j。i从前往后掠过小于pivot的值,j从后往前掠过大于pivot的
值,当i,j停止的时候,如果i<j,交换i,j所指位置上的值,否则break;
3.在小的数组中(数组的大小<cutoff),快排的效率并不高,所以小数组时候利用插入排序
void quicksort(int *nums,int n)
{
qs(nums,,n-);
}
void qs(int*nums,int left,int right)
{
int pv;
int i,j;
int cutoff=;
if(left+cutoff<=right)
{
pv=mid3(nums,left,right);
i=left;
j=right-;
while()
{
while(nums[++i]<pv);
while(nums[--j]>pv);
if(i<j)
swap(nums[i],nums[j]);
else
break;
}
swap(nums[i],nums[right-]);
qs(nums,left,i);
qs(nums,i+,right);
}
else
intersort(nums+left,right-left+);
}
int mid3(int *nums,int left,int right)
{
int center=(left+right)/;
if(nums[left]>nums[center])
swap(nums[left],nums[center]);
if(nums[left]>nums[right])
swap(nums[left],nums[right]);
if(nums[center]>nums[right])
swap(nums[center],nums[right]);
swap(nums[center],nums[right-]);
return nums[right-];
}
void swap(int &m,int &n)
{
m^=n;
n^=m;
m^=n;
}
void intersort(int *nums,int n)
{
int i,j;
int tmp;
for(i=;i<n;i++)
{
tmp=nums[i];
for(j=i;j>&&tmp<nums[j-];j--)
nums[j]=nums[j-];
nums[j]=tmp;
}
}
【Sort】QuickSort的更多相关文章
- 【Python&Sort】QuickSort
Python版的快排,使用递归. 1.设置递归终止条件,当元素个数<1时 2.从列表中pop出一个元素pv 3.列表中的剩余值与pv进行对比,大的放入smaller列表,小的放入larger列表 ...
- 【Sort】多种排序
这篇文章包含了插入排序,希尔排序,堆排序,归并排序和快速排序,是前几篇文章的集合. 一共包括三个文件 sort.h sort.cpp main.cpp 1.main.cpp #include < ...
- 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))
QuickSort In the previous challenge, you wrote a partition method to split an array into 2 sub-array ...
- 【sort】 基数排序
下面这段问答摘自csdn: 把基数排序说成桶排序应该是没有太大问题的.总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排 ...
- 【算法】QuickSort
快速排序,时间复杂度O(N*logN),要能熟练掌握! 以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主! 该 ...
- 【Sort】RadixSort基数排序
太晚了,明天有时间在写算法思路,先贴代码 ------------------------------------------------ 刚答辩完,毕业好难,感觉自己好水 ------------- ...
- 【Sort】Merge Sort归并排序
归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组 ...
- 【Sort】HeapSort
堆排序,时间复杂度O(N log N),实际使用中慢于使用Sedgewick增量的增量排序. 大致思路: 1.先在数组中建堆,如果是增量排序,则需要建一个大堆 2.每循环一次,把最大的数,也就是num ...
- 【Sort】希尔排序
希尔排序(ShellSort),缩小增量排序,使用希尔增量时最坏运行时间O(n^2),不同的增量会对运行时间产生显著影响. void shellsort(int *nums,int n) { int ...
随机推荐
- Gpt转mbr
1)Shift + F10 2)diskpart 3)list disk 4)select dist 0 5)clean 6)convert mbr [注]mbr常用于windows操作系统,而gpt ...
- ubuntu 下 编译ffmpeg 3.1.1
1,下载ggmpeg源码:http://ffmpeg.org/download.html 2.下载ndk ,百度 3.配置环境 3.1 编译FFMPEG时,出现了 ffmpeg yasm not fo ...
- linux上安装Jmeter
一.首先,你的linux上要有jdk,没有的话请参考上一篇 http://www.cnblogs.com/bigshan-1/p/6242991.html 二.延续上篇的linux用户xiaoming ...
- action中list传到JSP中取不到值的问题
今天遇到了这个问题 action中list传到JSP中取不到值 搞了半天是因为我在JSP中取值的的时候 <s:iterator value="shlist" var=&qu ...
- Notepad++中调试用心lua程序
一.配置: 1.打开Notepad++: 2. 按下F5,或者打开Run->Run… 3. 弹出Run的窗口 3. 这一步是最关键的,将下列语句拷贝粘贴至输入框中:cmd /k Python & ...
- Webupload + MVC 之上传下载
最近工作中用到了 MVC 的上传及下载 , 写下感受 本项目中用到的是百度的webuploader <!--引入Jquery--> <script src="~/Conte ...
- [安全学习环境]Win7 下DVWA安装指南
一.环境依赖: .Net Framework 3.5 PHP+MySQL 集成测试环境:XAMPP V3.2.1 二.环境准备 1.下载XAMPP(http://www.wampserver.com/ ...
- Python Data Visualization Cookbook 2.9.2
import numpy as np import matplotlib.pyplot as plt def is_outlier(points, threshold=3.5): if len(poi ...
- Laravel默认使用utf8_unicode_ci 即使数据库是utf8_general_ci
这样做的后果是,不方便和utf8_general_ci字符串字段进行JOIN查询ON.
- Centos 下安装Zabbix Linux 客户端
今天在linux上安装了客户端,过程如下: (1)下载zabbix客户端软件 wget www.zabbix.com/downloads/2.0.3/zabbix_agents_2.0.3.linux ...