快速排序,平均运行时间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的更多相关文章

  1. 【Python&Sort】QuickSort

    Python版的快排,使用递归. 1.设置递归终止条件,当元素个数<1时 2.从列表中pop出一个元素pv 3.列表中的剩余值与pv进行对比,大的放入smaller列表,小的放入larger列表 ...

  2. 【Sort】多种排序

    这篇文章包含了插入排序,希尔排序,堆排序,归并排序和快速排序,是前几篇文章的集合. 一共包括三个文件 sort.h sort.cpp main.cpp 1.main.cpp #include < ...

  3. 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))

    QuickSort In the previous challenge, you wrote a partition method to split an array into 2 sub-array ...

  4. 【sort】 基数排序

    下面这段问答摘自csdn: 把基数排序说成桶排序应该是没有太大问题的.总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排 ...

  5. 【算法】QuickSort

    快速排序,时间复杂度O(N*logN),要能熟练掌握! 以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主! 该 ...

  6. 【Sort】RadixSort基数排序

    太晚了,明天有时间在写算法思路,先贴代码 ------------------------------------------------ 刚答辩完,毕业好难,感觉自己好水 ------------- ...

  7. 【Sort】Merge Sort归并排序

    归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组 ...

  8. 【Sort】HeapSort

    堆排序,时间复杂度O(N log N),实际使用中慢于使用Sedgewick增量的增量排序. 大致思路: 1.先在数组中建堆,如果是增量排序,则需要建一个大堆 2.每循环一次,把最大的数,也就是num ...

  9. 【Sort】希尔排序

    希尔排序(ShellSort),缩小增量排序,使用希尔增量时最坏运行时间O(n^2),不同的增量会对运行时间产生显著影响. void shellsort(int *nums,int n) { int ...

随机推荐

  1. 0-ajax操作json(番外篇)

    [可以先看后边再看此文] get获取json 前端代码 <!DOCTYPE html> <html> <head> <meta charset="u ...

  2. 移动APP脚本录制

    1.安装补丁--LR_03105_patch4----mobile app(http/html) 2.录制软件和移动设备同处同一环境(160wifi连接移动设备),创建wifi热点 3.创建脚本-协议 ...

  3. 脚本录制--html模式和url模式

    设置位置:tool--recording options-recording 1.html模式--默认---结果较简单 脚本采用html页面的形式来展示,优点:容易维护.容易理解 2.url模式--- ...

  4. 【锋利的Jquery】读书笔记六

    ajax优点缺点 json格式的严格 { "people": [ { "firstName": "Brett", "lastNam ...

  5. chrome浏览器如何在本地安装谷歌访问助手教程

    许多用户都需要使用谷歌的gmail,搜索.我们目前可以用谷歌访问助手解决google无法访问的问题.那么谷歌访问助手在chrome浏览器中如何安装和使用呢?今天我们详细介绍. 本地安装谷歌访问助手的步 ...

  6. 使用pycharm+pyqt5 调取界面程序

    一.使用QtDesigner制作界面 1)打开的界面设计工具QtDesigner,如图: 2)新建窗体,选择Main Window: 3)分别在窗口添加如下控件,Calendar.3个pushButt ...

  7. 了解OutOfMemoryError异常 - 深入Java虚拟机读后总结

    JVM中的异常发生 Java虚拟机规范中除了程序计数器外,其他几个运行时区域都有发生OutOfMemoryError异常的可能. 本章笔记通过代码来验证Java虚拟机规范中描述的各个运行时区域存储的内 ...

  8. Fiddler的安装设置

    一.安装设置Fiddler2  下载完成后安装,安装完成后打开 如下图设置Fiddler 代理: 二.设置手机代理 快捷键win+r打开运行窗口à输入:cmdà确定 在界面上输入:ipconfig,查 ...

  9. [DP之普通系列]

    noip快要来了 要练练dp 难度也挺接近 还是挺好的 [Usaco2013 Nov]Pogo-Cow 这一道题要下一段大于这一段 所以的话我们就要记录每一段的状态 F[i,j]=F[j,k]+A[i ...

  10. 8.MyBatos的动态Sql

    1.创建javaWeb项目MyBatis_dynamicSQL并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17. ...