快速排序的算法导论划分形式和hoare划分

1. hoare划分

 1 int hoare_partition(int a[], int begin, int end)
 2 {
 3     int pivot = a[begin];
 4     int ini = begin;
 5     int ter = end;
 6     while (ini < ter)
 7     {
 8         while (a[ini] <= pivot && ini <end)
 9             ++ini;
10         while (a[ter] >= pivot && ter>begin)
11             --ter;
12         if (ini<ter)
13             swap(a[ini], a[ter]);
14
15     }
16     swap(a[ter], a[begin]);
17     return ter;
18
19 }
20 void quick_sort(int a[], int begin, int end)
21 {
22         if (begin < end)
23         {
24             int div = hoare_partition(a, begin, end);
25             cout << div << endl;
26             quick_sort(a, begin, div);
27
28             quick_sort(a, div+1, end);
29         }
30
31 }
  1.  1    算法导论的划分形式 int partition(int a[], int begin, int end)
     2 {
     3     int pivot = a[begin];
     4     int cur = begin + 1;
     5     int divid_location = begin;
     6     for (; cur <= end; ++cur)
     7     {
     8         if (a[cur] < pivot)
     9         {
    10             ++divid_location;
    11             int temp = a[divid_location];
    12             a[divid_location] = a[cur];
    13             a[cur] = temp;
    14         }
    15     }
    16     a[begin] = a[divid_location];
    17     a[divid_location] = pivot;
    18     return divid_location;
    19 }
    20 void quick_sort(int a[], int begin,int end)
    21 {
    22     if (end-begin > min_size)
    23     {
    24         int div = partition(a, begin, end);
    25         quick_sort(a, begin, div);
    26         int div_plus_1 = div + 1;
    27         quick_sort(a,div_plus_1, end);
    28     }
    29     insert_sort(a, begin, end);
    30 }

    区别在哪呢,区别在于hoare划分将区间分为两部分,而主元可能位于两个区间的任何一个,而算导的划分将其划为3部分。

    median-of-3改进等比较简单,不再赘述。

    关于快速排序的工业级实现,参见STL 源码剖析当中的讲解,我们会发现,和我们写的版本基本一致,当然为了保证递归不是很深,会进行优化,比如只对每次划分较短的一侧进行递归,另一个尾递归优化。

快速排序的算法导论划分形式和hoare划分,布布扣,bubuko.com

时间: 2024-10-09 21:54:04

快速排序的算法导论划分形式和hoare划分的相关文章

快速排序之算法导论实现

#include <iostream> using namespace std; int partition(int *a,int p,int r) { int x=a[r]; int i=p-1;//note i important which is used for //storage the number smaller than flag x=a[r] for (int j=p;j<r;j++) { if (a[j]<x)// if a[j] smaller than x=

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

算法导论第七章快速排序

一.快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法.现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1).快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择.原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序. (2).快速排序的思想和合并排序一样,即分治.快排排序的分治思想体现在: a.首先从待排序的数中选择一个作为基数,

算法导论4:快速排序 2016.1.4

今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想.我觉得很有道理. 好吧,不扯了.原谅我看书选择了速读策略,中间有很多感觉目前还很难看懂,以后有时间再细细学习.把略过去的在这里记一下. 一.矩阵乘法算法.复杂度从n^3优化到了n^2.81 (数字比较神奇).因为还没学线性代数,所以以后学了再看. 二.递归复杂度的计算和估计.这部分看起来有些复杂,好像需要比较高的数学水平,有空研究一下. 三.堆排序.这个以前已经写过了.http://www.cnblogs.com/itlqs/p/475

快速排序实现代码 算法导论7.1 7.2 7.4

快速排序通常是实际排序中应用最好的选择,因为平均性能很好,且是原址排序,不稳定. 书上的大部分内容在分析其运行时间,感觉看一下就好了(还是蛮喜欢数学的,可是...) #include <iostream> #include <algorithm> #include <random> using namespace std; //实际应用比较多,原址排序 typedef int index; index Partition(int *a, index p, index r

算法导论 第7章 快速排序

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小. 快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要:相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的. /

算法导论——lec 07 快速排序

一. 快速排序的描述 1. 快速排序是一种原地排序的算法,最坏情况下的时间复杂度为Θ(n^2),期望的运行时间为Θ(n logn),且其中隐含的常数因子较小. 2. 快速排序分三个步骤: 分解:数组A[p...r]被划分成两个数组A[p...q-1]和A[q+1...r],使得A[p...q-1]中的元素都小于等于A[q],A[q+1...r]中的元素都大于等于A[q].下标q在这个划分过程中计算. 解决:递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序. 合并:两个

《算法导论》 — Chapter 7 快速排序

序 快速排序(QuickSort)也是一种排序算法,对包含n个数组的输入数组,最坏情况运行时间为O(n^2).虽然这个最坏情况运行时间比较差,但是快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,期望的运行时间为O(nlgn),且O(nlgn)中隐含的常数因子很小,另外它还能够进行就地排序在虚拟环境中也能很好的工作. 原理 快速排序也和合并排序一样,基于分治法,分为分解.解决.合并三个步骤: 分解:数组array[low-high]被分为两个(可能空)子数组array[low-te

算法导论-快速排序

一.快速排序的描述 快速排序是基于分治策略的.对一个子数组A[p…r]快速排序的分治过程的三个步骤为: 1.分解 数组A[p…r]被划分成两个(可能空)子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],且小于等于A[q+1…r]中的元素.下标q也在这个划分过程中进行计算. 2.解决 通过递归调用快速排序,对子数组A[p…q-1]和A[q+1…r]排序. 3.合并 因为两个字数组就是原地排序的,将它们的合并不需要操作:整个数组A[p…r]已排序. 快速排