首页 > 其他分享 >Princeton Algorithms, Part I week3 Quick Sort

Princeton Algorithms, Part I week3 Quick Sort

时间:2023-11-19 16:57:07浏览次数:36  
标签:Sort sort Princeton int lo item Part quick hi

Quick Sort

今天学习quick sort,quick sort的基本思想是有一个数组,先shuffle以后,保证数组的item位置是均匀分布的,选择一个item然后,把所有比这个item大的放在item右边,所有比这个item小的放在左右,然后递归的进行这个操作,如下图所示

 这里面的partition部分如何实现呢?首先定义两个指针i和j ,i = lo +1,j = hi,然后i从左到右的扫描数组如果less(a[i],a[lo]), j从右到左的扫描数组如果less(a[lo],a[j]), 然后交换a[i]和a[j],重复这个过程直到指针i和指针j交叉。下面是partition方法的java implementation

public class QuickSort{

   private static int partition(Comparable[] a, int lo, int hi){

                 int i = lo, j = hi + 1;
                 while(True){

                        while(less(a[++i], a[lo])){
                                if(i == hi)break;
                                
}
                         while(less(a[lo],a[--j])){
                                     if(j == lo)break;
}
                         if(i >= j) break;
                         exch(a, i, j); 


}
                         exch(a, lo, j);
                         return j;

}



}

下图是整个partition过程

 接下来是quick sort的完整的java implementation

public class QuickSort{

            public static void sort(Comparable[] a){

                        shuffle(a); //  这里是为了让数组的item是均匀分布,是为了保证quick 
                                       //  sort的性能
                         sort(a, 0, a.length-1);

}
            private static void sort(Comparable[] a, int lo, int hi){

                     if(hi <= lo){return;}
                     int j = partition(a, lo, hi);
                     sort(a, lo, j-1);
                     sort(a, j+1, hi);
}

}

quick sort是in place的,他不需要额外的空间。在最好的情况下 quick sort的比较次数是正比于$NlgN$, 而在最坏的情况下是正比于$N^2$的.

 

我们可以分析一下在平均情况下的性能,下面是一个简单的证明过程。

 

 在实际使用的时候,quick sort是非常有用的,因为比较次数是二次幂的情况是非常罕见的,它比merge sort要多大约百分之39的比较次数,但是在实际中quick sort要更快, 因为少了数据的移动。shuffle操作可以防止最坏的例子,但是如果当我们要排序的item的key是正序或者逆序或者是有很多相同的key,quick sort的性能也会很差。

标签:Sort,sort,Princeton,int,lo,item,Part,quick,hi
From: https://www.cnblogs.com/easyjiang/p/17842242.html

相关文章

  • InsertionSort
     JavaprivatestaticvoidinsertionSort(int[]array){for(inti=1;i<array.length;++i){intindex=i-1,mark=array[i];while(mark<array[index]){array[index+1]=array[index];......
  • 大师学SwiftUI第18章Part1 - 图片选择器和相机
    如今,个人设备主要用于处理图片、视频和声音,苹果的设备也不例外。SwiftUI可以通过Image视图显示图片,但需要其它框架的支持来处理图片、在屏幕上展示视频或是播放声音。本章中我们将展示Apple所提供的这类工具。图片选择器SwiftUI内置了一个PhotosPicker结构体用于生成一个视图,允许用......
  • 夜深忽梦少年事(Part11)
    Part11铜色NOI不知不觉也快到国赛了,想想时间就像一把杀手锏。仿佛昨天,zzt、fym、jhr还是荟萃中学3个NOIP考400+的初中生,现在zzt进入国家队了,fym和jhr已经迎来他们的最后一场国赛了。时间真的变化太快了。那个初一因为初赛差点没过嚎啕大哭,初二第一次怯生生尝试报提高组,连提高算......
  • selectionSort
      JavapublicclassErsatz{publicstaticvoidmain(String[]args){int[]ints=newint[8];for(intv=0;v<ints.length;++v){ints[v]=(int)(Math.random()*9)+1;}System.out.println(Arr......
  • Spartacus ngsw-config.json 文件内容的详细解释
    以下是Spartacus项目ngsw-config.json文件的代码解释和示例:`index`:"/index.html",index:定义了服务工作线程(ServiceWorker)中的主页文件。在这个例子中,index设置为/index.html,表示在缓存策略中将会使用此作为主页文件。`assetGroups`:[{`name`:"app",......
  • 如何避免 Spartacus 重复发送 CMS page 请求
    如下图所示,启用了SSR之后,Spartacus在CSR模式下re-hydration时,会重复发送一次CMSpage请求:可以参考这个StackOverflow的讨论,通过下面的代码来阻止CSR模式下重复发送page请求:provideConfig(<RoutingConfig>{routing:{loadStrategy:RouteLoadStrategy.ONC......
  • 重写Java中Arrays数组工具类提供的sort()排序函数中的比较器类Comparator的compare()
    排序方法是我们日常开发或者写功能函数,或者实现算法时,常调用的方法。有时甚至,开发人员自己还要写一写排序算法。今天,我们来修改Java官方提供的Arrays工具类中的静态排序sort()方法。反问一下,为什么要重写呢?官方提供的还不够你用?回答:确实不够用,官方默认是对数字,特别是sort比较的......
  • 使用Linux命令sort及uniq对文件或屏幕输出进行分组统计
    sortdemo.txt|uniq-c|sort-rn|head-3在日常Linux操作常常需要对一些文件或屏幕数次中重复的字段进行分组统计。实现的方法非常简单,核心命令为:sort|uniq--c|sort-rn。sort:对指定列进行排序,使该列相同的字段排练到一起uniq-c:uniq命令用于检查及删除文本文件......
  • Solution - Partition Game
    Link.做vjudge的题有一种美丽的窒息的感觉。设\(f_{i,j}\)表示前\(i\)个选\(j\)段出来的最小代价,转移\(f_{i,j}=\min_{0\leqk<i}\{f_{k,j-1}+w_{k+1,i}\}\),\(w_{k+1,i}\)是\([k+1,i]\)这一段的代价,时间复杂度\(O(n^2k)\),然后就不会做了/l......
  • 入门c语言--3---关于qsort函数的一些理解
     qsort函数是c语言库函数的一种,作用是将所给的数组中的元素按要求进行排序。 qsort函数可以理解为冒泡函数的进阶,冒泡函数只能对一些如int,char等类型的数组进行排序,当遇到自主定义的struct类型的数组时便不能进行排序。此时便可以通过qsort函数进行排序。  在使用qsort函数......