PHP 排序算法实现讲解

180 阅读2分钟

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

分别使用插入排序法,冒泡排序法,选择排序法,快速排序法,将下面数组中的值进行按照从小到大的顺序进行排序操作。

1$arr (12,43,57,32,51,76,36,91,28,46,40);

\

1、插入排序法

分析:既定前面数字已经排好顺序,现在要把第n个数字插入到前面有序的数组中,使得这n个数字也是有序的放入其中,如此反复循环直至全部排好顺序。

具体代码实现如下:

123456789101112131415161718$arr (12,43,57,32,51,76,36,91,28,46,40);``function insertSort( $arr ) {````$len = count ( $arr );````for ( $i =1, $i < $len ; $i ++) {````$tmp = ``$arr [ $i ];````for ( $j = $i -1; $j >=0; $j --) {````if ( $tmp < ``$arr [ $j ]) {````//比较大小当数字小时交换位置,将后面的数字与前面的数字进行互换操作````$arr [ $j +1] = ``$arr [ $j ];````$arr [ $j ] = ``$tmp ;````} else {````//不需要,直接跳过````break ;````}````}````}````return $arr ;``}

\

2、冒泡排序法

分析:从前往后对相邻的两个数字依次进行比较调整,让较大的数字往下沉,让较小的数字往上升,即每相邻的数字进行对比排序,顺序不符合时将其调换位置。

具体代码实现如下:

123456789101112131415161718$arr (12,43,57,32,51,76,36,91,28,46,40);``function bubbleSort( $arr )``{````$len = count ( $arr );````for ( $i =1; $i < $len ; $i ++)````{ //循环比较次数````for ( $k =0; $k < $len - $i ; $k ++)````{````if ( $arr [ $k ]> $arr [ $k +1])````{````$tmp = $arr [ $k +1];````$arr [ $k +1]= $arr [ $k ];````$arr [ $k ]= $tmp ;````}````}````}````return $arr ;``}

\

3、选择排序法

分析:选出最小的一个数字与第一个位置数字交换,之后再剩余的数当中再次找到最小的数字与第二个位置交换,依此循环到倒数第二个数字和最后一个数字比较结束为止。

具体代码实现如下:

12345678910111213141516171819202122$arr (12,43,57,32,51,76,36,91,28,46,40);``function selectSort( $arr ) {````$len = count ( $arr );````for ( $i =0; $i < $len -1; $i ++) {````//假设最小值的位置````$p = ``$i ;````for ( $j = $i +1; $j < $len ; $j ++) {````//$arr[$p] 已知的最小值````if ( $arr [ $p ] > ``$arr [ $j ]) {````//比较发现更小的记录下最小值的位置,并且在下次比较时采用已知的最小值进行比较。````$p = ``$j ;````}````}````//确定当前最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。````if ( $p != ``$i ) {````$tmp = ``$arr [ $p ];````$arr [ $p ] = ``$arr [ $i ];````$arr [ $i ] = ``$tmp ;````}````}````return $arr ;``}

\

4、快速排序法

分析:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

具体代码实现如下:

123456789101112131415161718192021222324252627$arr (12,43,57,32,51,76,36,91,28,46,40);``function quickSort( $arr ) {````//判断是否继续进行````$length = ``count ( $arr );````if ( $length <= 1) {````return $arr ;````}````//选择第一个数字作为基准````$base_num = ``$arr [0];````//遍历除了基准外的所有数字,按照大小关系放入两个数组内,之后初始化两个数组````$left_array = ``array (); //小于基准````$right_array = ``array (); //大于基准````for ( $i =1; $i < $length ; $i ++) {````if ( $base_num > ``$arr [ $i ]) {````//放入左边数组````$left_array [] = ``$arr [ $i ];````} else {````//放入右边数组````$right_array [] = ``$arr [ $i ];````}````}````//分别对两数组进行相同的排序处理方式递归````$left_array = quick_sort( $left_array );````$right_array = quick_sort( $right_array );````//合并数组````return array_merge ( $left_array , array ( $base_num ), $right_array );``}

来源地址:blog.yoodb.com/yoodb/artic…