本文总结了常用的7种排序方法,并用PHP语言实现。

1。直接插入排序




*
*直接插入排序,在当前插入位置之前命令元素顺序的想法,
*如果插入当前位置的元素大于有序元素的最后一个元素,则将不会执行任何操作。
*否则在有序序列中找到插入位置并将其插入序列中。
* /
函数插入排序($ ARR){
$ len =计数($ ARR);
($ i = 1;$ i;
如果($ ARR { $ I-1 } > {我} { $ ARR)
对于($ = i $ 1;$ j = 0;$ j -){
美元美元美元TMP = { 1 } J + ARR;
如果($ TMP < $ ARR { $ J }){
$ ARR { $ J + 1 } = {,} ARR美元美元;
ARR { } =美元美元美元,TMP;
其他{ }
打破;
}
}
}
}
返回的数组;
}



2、冒泡排序




*
冒泡排序,冒泡排序思想:N-1次冒泡排序,22调整最大值的数组的末尾(阵)在每个行程结束
* /
功能的冒泡排序($ ARR){
$ len =计数($ ARR);
($ i = 1;$ i;
为($ = 0;$;
如果($ ARR { $ J } > $ ARR { $ J + 1 }){
美元美元美元TMP = { 1 } J + ARR;
$ ARR { $ J + 1 } = {,} ARR美元美元;
ARR { } =美元美元美元,TMP;
}
}
}
返回的数组;
}



三.排序的简单选择




*
简单选择排序,简单排序思想:从数组的第一个元素依次从小到大确定元素。
* /
功能选择排序($ ARR){
$ len =计数($ ARR);
($ i = 0;$ i;
美元=我;
对于($ = $ i + 1;$ J $;
如果($ ARR { $ K } > $ ARR { $ J }){
美元= J;
}
}
如果(k)!= $ i){
TMP =美元美元美元ARR {我};
ARR {我} =美元美元美元美元K ARR { };
ARR { } = K美元美元美元的TMP;
}
}
返回的数组;
}



4,Hill排序




*
希尔排序,希尔排序原则:将数组分成若干子序列由一个指定的步骤,和子序列的序列排序,分别为(在这种情况下)
* /
功能希尔($ ARR){
$ len =计数($ ARR);
美元=地板($ 2);
当($ k>0){
($ i = 0;$ i $ K;$ + +){
为($ = $ i;$ J $ $,($ + K $));
如果($ ARR { $ J } > $ ARR { $ J + $ K }){
TMP =美元美元美元美元K J + ARR { };
$ ARR { $ J + $ K } = {,} ARR美元美元;
ARR { } =美元美元美元,TMP;
}
}
}
美元=地板($ 2);
}
返回的数组;
}



5。快速排序




*
快速排序:快速排序:记录由一个记录序列分成两个独立部分,其中记录的键没有一个是相同的。
*另一部分记录关键词,然后对记录的两个部分进行快速排序,以实现整个序列的顺序,并完成具体的实践。
*每个序列为第一个记录的关键字和最后一个记录的关键字设置一个标准的键和指针。
*快速排序($ ARR,0,计数($ ARR)- 1);
* /
功能快速排序(美元美元美元ARR,低、高){
如果(低$ <高){
美元=低;
美元=高;
原发性=美元美元美元ARR {低};
当($ i $ j){
当($ I = $主要){
美元—;
}
如果($ i $ j){
$ ARR { $ i++ } = {,} ARR美元美元;
}
当(i j < $ ARR { $我} < = $小学){
美元+;
}
如果($ i $ j){
$ ARR { $ J—} = {我} ARR美元美元;
}
}
ARR {我} =美元美元美元的原;
快速排序(ARR美元美元美元,低,I-1);
快速排序(美元啊,我+ 1美元美元,高);
}
}


6、堆排序




*
堆排序
* /

为大型根堆过程调整堆,$ s堆根位置$ m堆最后一个元素位置
功能heapadjust(ARR美元,美元,美元,M){
TMP =美元美元美元ARR { };
调整可能会影响根堆中的左/右子堆。
for循环作用是确保子堆是根堆。
对于($ = 2 * $ + 1;$ J = $ M;$ = 2 * $ J + 1){
在孩子周围找到最大根节点,然后使用最大和根节点比较,
如果然后调整,否则根据根桩的特点,走出循环。
如果(J<m ARR { $ J } < $ ARR { $ J + 1 }){

}
如果($ TMP = $ ARR { $ J }){
打破;
}
ARR { } =美元美元美元美元ARR {,};
美元= J;
}
ARR { } =美元美元美元的TMP;
}

堆排序
功能排序($ ARR){
$ len =计数($ ARR);
为了从堆堆中调整根堆
为($ = i的地板($ 2:1);$ i = 0;$ I -){
heapadjust(ARR美元美元美元,我len-1);
}
为了改变根节点到最后位置,再次调整堆为树根桩,找到最大值,
打开一个有序数组
为(N = len-1美元;n>0美元美元;n){
TMP =美元美元美元ARR { };
{ } = ARR美元美元美元ARR { 0 };
$ ARR { 0 } = $ TMP;
heapadjust($ 0,$ ARR,n-1);
}
返回的数组;
}




7、合并排序




*
归并排序,这里是实现两种归并方式。
* /
订购前美元{ S。M } / / $ arr2 { m + 1。},融入有序arr2 { }美国美元。
合并功能(前美元,美元美元美元arr2 S,M,N){
对于($ = $ s,$ I = $ S,$ = $ M + 1;$ i米$ = $;
如果($ arr1 { $我} {,}前<<美元美元){
{ } = K arr2美元美元美元美元+ } {我前;
{ }人
{ } = K arr2美元美元美元美元ARR1 J++ } {;
}
}
如果($ $ m){
为(($);
$ arr2 { $ K + } = {我}前美元美元;
}
否则如果}($ < $ = n){
用于(($ = $ = $;$ + +){)
$ arr2 { $ K + } = {,}前美元美元;
}
}
}

双向合并的递归形式
函数的MSort(前美元,美元美元美元arr2 S,T){
如果($ = $ t){
{ } = arr2美元美元美元美元ARR1 { };
{ }人
美元=地板((美元+ T) 2);
tmp_arr美元=阵();
MSort(前tmp_arr美元,美元,美元,百万元);
MSort(约前,tmp_arr美元,$ M + 1,$ T);
合并(tmp_arr美元,美元美元美元arr2,M,T);
}
}

两个 / /合并数组元素{ 0 } $ ARR .. n-1
function mergeSort($ ARR){
$ len =计数($ ARR);
MSort(ARR ARR 0美元,美元,美元,len-1);
返回的数组;
}




使用经验

如果排序中的记录数小于n,则可以使用直接插入排序和简单选择排序。当记录本身的信息量较大时,最好使用简单的选择排序方法。

如果排序记录基本上按关键字排序,则适合直接插入排序和冒泡排序。

如果n值很大,可以使用快速排序、堆排序和合并排序。此外,快速排序被认为是内部排序的最佳方法。

以上是本文的全部内容,希望能对大家有所帮助。