<?php 002 /** 003 * 插入排序(一维数组) 004 * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。 005 */ 006 function insertSort($arr) { 007 if (!is_array($arr) || count($arr) == 0) { 008 return $arr; 009 } 010 $count = count($arr); 011 for ($i = 1; $i < $count; $i++) { 012 if (isset($arr[$i])) { 013 $tmp = $arr[$i]; //获取后一个元素的值 014 $j = $i - 1; //获取前面的下标 015 while ($arr[$j] > $tmp) { //如果前面一个比后面一个大, 这里是从小到大 016 $arr[$j + 1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 017 $arr[$j] = $tmp; 018 $j--; 019 } 020 } 021 } 022 return $arr; 023 } 024 025 /** 026 * 选择排序(一维数组) 027 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 028 */ 029 function selectSort($arr) { 030 if (!is_array($arr) || count($arr) == 0) { 031 return $arr; 032 } 033 $count = count($arr); 034 for ($i = 0; $i < $count; $i++) { 035 $k = $i; 036 for ($j = $i + 1; $j < $count; $j++) { 037 if ($arr[$k] > $arr[$j]) 038 $k = $j; //找出最小的 039 if ($k != $i) { 040 $tmp = $arr[$i]; 041 $arr[$i] = $arr[$k]; 042 $arr[$k] = $tmp; 043 } 044 } 045 } 046 return $arr; 047 } 048 049 /** 050 * 冒泡排序(一维数组) 051 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 052 */ 053 function bubbleSort($array) { 054 $count = count($array); 055 if ($count <= 0) { 056 return false; 057 } 058 for ($i = 0; $i < $count; $i++) { 059 for ($j = $count - 1; $j > $i; $j--) { 060 if ($array[$j] < $array[$j - 1]) { //比较找到的数进行交换 061 $tmp = $array[$j]; 062 $array[$j] = $array[$j - 1]; 063 $array[$j - 1] = $tmp; 064 } 065 } 066 } 067 return $array; 068 } 069 070 /** 071 * 快速排序(一维数组) 072 */ 073 function quickSort($array) { 074 if (count($array) <= 1) { 075 return $array; 076 } 077 $key = $array[0]; 078 $left_arr = array(); 079 $right_arr = array(); 080 for ($i = 1; $i < count($array); $i++) { 081 if ($array[$i] <= $key) { 082 $left_arr[] = $array[$i]; 083 } else { 084 $right_arr[] = $array[$i]; 085 } 086 } 087 $left_arr = quickSort($left_arr); 088 $right_arr = quickSort($right_arr); 089 return array_merge($left_arr, array( 090 $key 091 ), $right_arr); 092 } 093 094 /** 095 * 按照元素的值进行排序 096 * strOrder 为排列的顺序 asc 升序 desc 降序 097 */ 098 function sortByVal($arr, $strOrder = 'asc') { 099 if (!is_array($arr) || count($arr) == 0) { 100 return $arr; 101 } 102 103 $arrReturn = array(); 104 foreach ($arr as $key => $val) { 105 $arrKey[] = $key; 106 $arrVal[] = $val; 107 } 108 109 $count = count($arrVal); 110 if ($count) { 111 //创建key的顺序数组 112 for ($key = 0; $key < $count; $key++) { 113 $arrKeyMap[$key] = $key; 114 } 115 //对值进行排序 116 for ($i = 0; $i < $count; $i++) { 117 118 for ($j = $count - 1; $j > $i; $j--) { 119 //<从小到大排列 升降在这修改 120 $bol = $strOrder == 'asc' ? $arrVal[$j] < $arrVal[$j - 1] : $arrVal[$j] > $arrVal[$j - 1]; 121 if ($bol) { 122 $tmp = $arrVal[$j]; 123 $arrVal[$j] = $arrVal[$j - 1]; 124 $arrVal[$j - 1] = $tmp; 125 //值的冒泡排序,引起key的数组的交互 126 $keytmp = $arrKeyMap[$j]; 127 $arrKeyMap[$j] = $arrKeyMap[$j - 1]; 128 $arrKeyMap[$j - 1] = $keytmp; 129 } 130 } 131 } 132 if (count($arrKeyMap)) { 133 foreach ($arrKeyMap as $val) { 134 $arrReturn[] = $arrKey[$val]; 135 } 136 } 137 return $arrReturn; 138 } 139 } 140 141 /** 142 * 使用原生的函数进行数组按照值进行排列 143 */ 144 function arraySortByVal($arr, $keys, $type = 'asc') { 145 $keysvalue = $new_array = array(); 146 foreach ($arr as $k => $v) { 147 $keysvalue[$k] = $v[$keys]; 148 } 149 if ($type == 'asc') { 150 asort($keysvalue); 151 } else { 152 arsort($keysvalue); 153 } 154 reset($keysvalue); 155 foreach ($keysvalue as $k => $v) { 156 $new_array[$k] = $arr[$k]; 157 } 158 return $new_array; 159 }
The above introduces the PHP sorting implementation, including aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials.