Home  >  Article  >  Backend Development  >  PHP sorting implementation

PHP sorting implementation

WBOY
WBOYOriginal
2016-08-08 09:30:501125browse

<?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 = &#39;asc&#39;) {
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 == &#39;asc&#39; ? $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
}

j

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.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:Head First-Observer ModeNext article:Head First-Observer Mode