算法---高速分拣(quick sort)
在前面的排序中所描述的算法。最快的排序算法是归并排序,但是有一个缺陷合并排序排序过程的需求O(N)额外的空间。本文介绍了高速的排序算法到位排序算法,所需的复杂性的额外空间O(1)。
算法介绍:高速排序事实上一种依据需找某个元素的详细位置进行排序的方法。比方所存在例如以下数组
选择第一个元素5。找到5终于的位置。即5的左边的数都小于或者等于5。右边的数都大于或者等于5.
从"6"開始,可知6大于5,此处停住。从“2”開始2小于5,因此交换6与2的位置。然后接着往下走,将全部小于等于5的都放在左边,大于等于5的都放在右边,等到例如以下所看到的的数组:
此时的索引在4的位置,然后交换5和4的位置,这样就保证了左边的都小于5。右边的都大于5。
然后再分别对5的左右两边反复上述过程就可以将数组按升序排列。
算法发复杂度分析:如果每次都从中间将数组分开,且算法的执行时间为T(N)。则根据算法的执行过程可知。找到当前元素的位置须要扫面一遍数组即N次,然后再对此元素两边的子数组反复上述操作。
为此T(N)=2*T(N/2)+N,解得T(N)=O(NlogN)。
算法实现:
寻找切分点
int sort::partition(int* a, const int low, const int high)
{
int value = a[low];
int i=low;
int j=high+1;
while (1)
{
while(a[++i] < value)
{
if(i == high) break;
}
while(value < a[--j]);
//a[low] == value,因此能够知道j==low时。此推断条件不成立,可知此时i必大于j,从而整个循环结束。
if(i>=j)
break;
swap(a,i,j);
}
swap(a,low,j);
return j;
}
高速排序:
void sort::quick_sort(int* a, const int low, const int high)
{
if(low >= high)
return;
int loc = partition(a,low,high);
quick_sort(a,low,loc-1);
quick_sort(a,loc+1,high);
}
上述即为高速排序的详细实现。可是对上述算法还有非常多的改进之处。比方说对存在大多数反复数据的数组排序,初始切分点的选取等等都能够进行改进。详细的改进例如以下所看到的:
对于较小的子数组使用插入排序:
void sort::insert_sort_update(int* a, const int n)
{
for(int i=1; i<n; i++)
{
int j=i;
int temp = a[i];
for(; j>0 && temp < a[j-1]; j--)
{
a[j] = a[j-1];
}
a[j] = temp;
}
}
void sort::quick_sort_update_with_insert_sort(int* a, const int low, const int high)
{
if(high <= low+N)
{
insert_sort_for_update(a,low,high);
return;
}
int loc = partition(a,low,high);
quick_sort_update_with_insert_sort(a,low,loc-1);
quick_sort_update_with_insert_sort(a,loc+1,high);
}
对于含有大多数反复元素的改进:
void sort::quick_sort_update_with_partition(int* a,const int low, const int high)
{
if(low>=high)
return;
int lt = low;
int gt = high;
int value = a[low];
int i=low+1;
while(i<=gt)
{
if(a[i]<value)
{
swap(a,i,lt);
i++;
lt++;
}
else if(a[i] > value)
{
swap(a,i,gt);
gt--;
}
else
{
i++;
}
}
quick_sort_update_with_partition(a,low,lt-1);
quick_sort_update_with_partition(a,gt+1,high);
}
他说,博文介绍了高速的排序算法和改进。欢迎拍砖
版权声明:本文博客原创文章,博客,未经同意,不得转载。
算法---高速分拣(quick sort)的更多相关文章
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 排序算法—快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
- js 实现排序算法 -- 快速排序(Quick Sort)
原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...
- 基础算法之快速排序Quick Sort
原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...
- 算法 quick sort
// ------------------------------------------------------------------------------------------------- ...
- 【算法】快速排序(Quick Sort)(六)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
随机推荐
- ORACLE中%TYPE和%ROWTYPE的使用
1 %TYPE说明 为了使一个变量的数据类型与还有一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式.当被參照的那个变量的数据类型改变了之后,这个新定 ...
- ubuntu配置jdk脚本以及导致开不了机的解决方案
关于在那个文件里配置jdk脚本,有些大牛总结了四个地方,大体就是ubuntu系统启动后会默认加载的四个地方.例如:/etcenvironment,/etc/profile这两个文件处于系统层面的,还有 ...
- 使用RouteDebugger对MVC路由进行调试
在Asp.Net MVC程序中,路由是MVC程序的入口,每一个Http请求都要经过路由计算,然后匹配到相应的Controller和Action.通常我们的路由都会注册在Global.asax.cs文件 ...
- hdu1114(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 分析:很裸的一道完全背包题,只是这里求装满背包后使得价值最少,只需初始化数组dp为inf:dp[ ...
- 调用微信退款接口时,证书验证出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置- ...
- SVN的revert和update命令的区别
svn中的revert和update 今天有人问到revert和update的问题. 刚开始还真被问住了. 因为感觉revert和update都可以将本地的copy更新到以前的一个版本,会有什么不同呢 ...
- centos6搭建本地openstack软件源
1.把相关软件包所有下载到本地机器 wget -np -nH –cut-dirs=1 -r -c -L –exclude-directories=repodata –accept=rpm,gz,xml ...
- ocx控件手动修改clsid的方法
替换掉工程的两个地方:IDL文件和CTRL文件. IMPLEMENT_OLECREATE_EX(CMultiwndCtrl, "MULTIWND.MultiwndCtrl.1", ...
- JS正则验证邮箱的格式
一.相关的代码 1 function test() 2 { 3 var temp = document.getElementById("text ...
- 从零开始学Xamarin.Forms(二) 环境搭建、创建项目
原文:从零开始学Xamarin.Forms(二) 环境搭建.创建项目 一.环境搭建 Windows下环境搭建: 1.下载并安装jdk.Android SDK和NDK,当然还需要 VS2013 ...