在前面的排序中所描述的算法。最快的排序算法是归并排序,但是有一个缺陷合并排序排序过程的需求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)的更多相关文章

  1. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  2. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  3. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  4. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  5. 排序算法—快速排序(Quick Sort)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  6. js 实现排序算法 -- 快速排序(Quick Sort)

    原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...

  7. 基础算法之快速排序Quick Sort

    原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...

  8. 算法 quick sort

    // ------------------------------------------------------------------------------------------------- ...

  9. 【算法】快速排序(Quick Sort)(六)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

随机推荐

  1. 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等

    (1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...

  2. nyoj 130 同样的雪花 【哈希】

    同样的雪花 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 You may have heard that no two snowflakes are alike. ...

  3. Note for video Machine Learning and Data Mining——Linear Model

    Here is the note for lecture three. the linear model Linear model is a basic and important model in ...

  4. hdu 4529 Double Dealing (置换群)

    # include <stdio.h> # include <algorithm> # include <string.h> using namespace std ...

  5. java 参数传递

    由一个问题来引入参数传递的问题 public static void main(String[] args) { int x=1; int[] y =new int[10]; m(x,y); Syst ...

  6. SE 2014年4月24日

    如图配置交换网络 由于网络规模较小,企业将网络划分为了接入层和核心层两层 核心层设备(Sw1 Sw2 Sw3)作为用户的网关设备,提供三层转发功能 接入层设备(SW4 SW5)连接用户,分别划分三vl ...

  7. hdu1011(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs& ...

  8. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

    特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...

  9. 用C++语言开发Android程序 配置开发环境

    转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境   如果你是一个C++语言的死忠,你喜欢C++语言到 ...

  10. SignalR技术

    Asp.net SignalR快速入门 一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到Sign ...