QuickSort是一种分期治疗的算法。 在分割统治的算法设计范式中,我们将问题递归划分为子问题,然后解决子问题,最后结合解决方案找到最终结果。
把问题分成子问题时要记住的一个事情是子问题的结构不像原来的问题那样变化。
分割的算法有三个步骤。
划分:将问题分解为子问题并征服:递归解决并整合子问题:整合解决方案并获得最终结果
有几种基于分割统治范式的算法。 快速排序和合并排序是其中之一。
QuickSort最坏情况下的时间复杂度是o(n2 ),比许多其他排序算法(如“合并排序”和“堆栈排序”)更高,但实际上QuickSort速度更快。 这是因为其内部环路可以在大多数架构和大多数架构中有效地实现实际数据。
探索路线
谈谈快速排序算法的实现。 快速排序算法采用透视元素,在透视元素周围分割数组。 Quicksot有多种变化,具体取决于如何选择透视元素。 有多种选择透视元素的方法。
选择第一个元素选择最后一个元素选择随机元素选择中值元素下一个重要的是快速排序算法的partition ()函数。 拆分功能获取透视元素,将其放在右侧,将小于透视元素的所有元素向左移动,将大于透视元素的所有元素向右移动。 快速排序需要线性时间。
然后,将数组从数据透视元素分为两个部分:小于数据透视元素的元素和大于数据透视元素的元素,并使用快速排序算法递归地对这两个数组进行排序。
现在,我们知道了快速排序算法的工作原理。 让我们看看如何在Java中实现快速排序算法。
快速排序http://www.Sina.com/*快速排序功能要求使用最小和最大索引对数组进行排序* /
voidsort(intarr )、int lowIndex、int highIndex )//untillowindex=highindexif (lowindexhighindex )//partitioninnndex sort(arr,p 1,highIndex ); }现在,让我们看看分区代码,了解其工作原理吧。
在分区功能:分区代码中,选择最后一个元素作为透视元素。 遍历整个数组。 也就是说,在本例中使用变量j。 跟踪数组中的最后一个最小元素。 也就是说,在本例中使用变量I。 如果发现小于轴心点的元素,则交换当前元素a [j]和arr [i]进行移动。 否则,继续遍历。
intpartition(intarr[],int lowIndex,int highIndex ) )/makingthelastelementaspivotintpivot=arr [ high index ]; //usingitokeeptrackofsmallerelementsfrompivotinti=(低索引-1); for (intj=低索引; j highIndex; j )//ifcurrentelementissmallerthanorequaltopivotif (arr [ j ]=pivot ) ) I; //increment I//swapithelementwithjthelementinttemp=arr [ I ]; arr[i]=arr[j]; arr[j]=temp; }//movingpivotatitscorrectpositioninttemp=arr [ i1 ]; arr[i 1]=arr[highIndex]; arr[highIndex]=temp; 返回I 1; }
现在,我们已经了解了快速sort和分区的功能,现在让我们简单地看一下整个代码
快速sort http://www.Sina.com/import Java.util.arrays; classquicksortdemo//partitionmethodintpartition (intarr [ ],int lowIndex,int highIndex ) intpivot=arr ) high index系统intI=(lowindex-1 ); for (intj=低索引; j highIndex; j () if ) ARR[j]=pivot ) ) I; int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } system.out.println (arrays.tostring (arr ); }int temp=arr[i 1]; arr[i 1]=arr[highIndex]; arr[highIndex]=temp; 返回I 1; }voidsort(intarr[],int lowIndex,int highIndex ) if ) lowIndexhighIndex ) intpi=partition ) arr、lowindex、high index sort(arr,pi 1,highIndex ); }staticvoidprintarray(intarr[] ) {int n=arr.length; for(intI=0; i n; I ) system.out.print(arr[I] '; System.out.println (; } publicstaticvoidmain (string args () intarr )={ 15、85、35、95、45、65、75 }; int n=arr.length; quicksortdemoob=newquicksortdemo (; ob.sort(arr,0,n - 1 ); system.out.println (固态阵列); 打印机(arr; }} 码75
[15、85、35、95、45、65和75]
[15、85、35、95、45、65和75]
[15、35、85、95、45、65和75]
[15、35、85、95、45、65和75]
[15、35、45、95、85、65和75]
[15、35、45、65、85、95和75]
65
[15、35、45、65、75、95和85]
[15、35、45、65、75、95和85]
[15、35、45、65、75、95和85]
45
[15、35、45、65、75、95和85]
[15、35、45、65、75、95和85]
35
[15、35、45、65、75、95和85]
85
[15、35、45、65、75、95和85]
固态阵列
15 35 45 65 75 85 95