PHP排序算法的复习和总结

对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort  arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。

直接上代码吧!

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

<?php

/*

 * 插入排序(一维数组)

 * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。

 */

function insertSort($arr){

    if(!is_array($arr) || count($arr)==0){

        return $arr;

    }

    $count = count($arr);

    for($i=1; $i<$count; $i++){

        if(isset($arr[$i])){

        $tmp = $arr[$i]; //获取后一个元素的值

        $j = $i - 1; //获取前面的下标

        while($arr[$j] > $tmp){ //如果前面一个比后面一个大, 这里是从小到大

            $arr[$j+1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个

            $arr[$j] = $tmp;

            $j--;

        }

        }

    }

    return $arr;

}

  

/*

 * 选择排序(一维数组)

 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

 */

function selectSort($arr){

    if(!is_array($arr) || count($arr) == 0)

    {

        return $arr;

    }

    $count = count($arr);

    for($i=0; $i<$count; $i++){

        $k = $i;

        for($j=$i+1; $j<$count; $j++){

      if ($arr[$k] > $arr[$j])

        $k = $j; //找出最小的

        if ($k != $i){

            $tmp = $arr[$i];

            $arr[$i] = $arr[$k];

            $arr[$k] = $tmp;

          }

       }

    }

    return $arr;

}

/*  

 * 冒泡排序(一维数组)

 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止

 */

function bubbleSort($array){

    $count = count($array);

    if ($count <= 0) {

        return false;

    }

    for($i=0; $i<$count; $i++){

        for($j=$count-1; $j>$i; $j--){

           if ($array[$j] < $array[$j-1]){ //比较找到的数进行交换

            $tmp = $array[$j];

            $array[$j] = $array[$j-1];

            $array[$j-1] = $tmp;

           }

        }

    }

    return $array;

}

  

/*

 * 快速排序(一维数组)

 *

 */

function quickSort($array){

    if (count($array) <= 1){

        return $array;

    }

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

      if ($array[$i] <= $key){

           $left_arr[] = $array[$i];

      }else{

         $right_arr[] = $array[$i];

        }

    }

    $left_arr = quickSort($left_arr);

    $right_arr = quickSort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

/**

  * 按照元素的值进行排序

  * strOrder 为排列的顺序 asc 升序  desc 降序

  */

function sortByVal($arr,$strOrder=‘asc‘)

{

    if(!is_array($arr) || count($arr)==0)

    {

        return $arr;

    }

    $arrReturn = array();

    foreach($arr as $key=>$val)

    {

        $arrKey[] = $key;

        $arrVal[] = $val;

    }

    $count = count($arrVal);

    if($count)

    {

        //创建key的顺序数组

        for($key=0;$key<$count;$key++)

        {

            $arrKeyMap[$key] = $key

        }

        //对值进行排序

        for($i=0;$i<$count;$i++)

        {  

            

            for($j = $count-1; $j>$i;$j--)

            {

                //<从小到大排列 升降在这修改

                $bol = $strOrder == ‘asc‘ ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1];

                if($bol){

                    $tmp = $arrVal[$j];

                    $arrVal[$j] = $arrVal[$j-1];

                    $arrVal[$j-1] = $tmp;

                    //值的冒泡排序,引起key的数组的交互   

                    $keytmp = $arrKeyMap[$j];

                    $arrKeyMap[$j] = $arrKeyMap[$j-1];

                    $arrKeyMap[$j-1] = $keytmp;

                }

            }

        }

        if(count($arrKeyMap))

        {

            foreach ($arrKeyMap as $val)

            {

                    $arrReturn[] = $arrKey[$val];

            }

        }

        return $arrReturn;

    }

}

/**

  * 使用原生的函数进行数组按照值进行排列

  */

function arraySortByVal($arr,$keys,$type=‘asc‘){

    $keysvalue = $new_array = array();

    foreach ($arr as $k=>$v){

        $keysvalue[$k] = $v[$keys];

    }

    if($type == ‘asc‘){

        asort($keysvalue);

    }else{

        arsort($keysvalue);

    }

    reset($keysvalue);

    foreach ($keysvalue as $k=>$v){

        $new_array[$k] = $arr[$k];

    }

    return $new_array;

}

  

对于下面的2个对于array的值进行排序的方法一个是自己实现的一个是使用了原生的PHP函数的,其实排序对于少量数据一般就单页的数据量的数据还是可以的,如果涉及到大量的数据的排序,建议可以整合到MYSQL的基础类中来进行。

时间: 2024-10-01 07:04:58

PHP排序算法的复习和总结的相关文章

排序算法的复习和总结[PHP实现]

对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort  arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结. 直接上代码吧! <?php /** * 插入排序(一维数组) * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序:直到待排序的数据元素全部插入完成为止. */ function insertSort($arr) {

聊一聊排序算法

聊一聊排序算法 原创 2016-08-11 Barret李靖 两月前花了些时间,将大学里学过的排序算法都复习了一遍,代码放在 github 上,没有整理.今天翻了翻代码,重新 review 了一遍,也顺便做了点记录. 下面花了不少篇幅,将基础排序.希尔.归并.快排.堆排序等都介绍了一通,懒得思考的同学可以略过代码直接看文字,文章对排序的基本思路都做了介绍. 本文的代码可以在这里找到:https://github.com/barretlee/algorithms 三种基本排序 插入排序和选择排序是

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

复习数据结构:排序算法(一)——插入排序

从这一篇开始,计划复习一下数据结构的基本知识.一来是为了开年之后的找工作,二来是为了想提升自己的编程能力.由于这些数据结构知识点,之前都学习过,这里我们就提炼出每个知识点的核心,以及代码实现. 这篇先说排序算法中的插入排序. 插入排序是一种稳定排序算法,属于内排序.适合少量数据量的排序. 当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2). 当输入数组倒序排列时,插入排序时复为:O(n^2). 平均时间复杂度:O(n^2). 代码实现如下: #include<iostream>

排序算法复习

排序算法复习 作者:vpoet mails:[email protected] 注:转载请注明出处 #include <iostream> #include <windows.h> using namespace std; void Bubble_Sort(int UnSort[],int length); void Select_Sort(int UnSort[],int length); void Insert_Sort(int UnSort[],int length); vo

数据结构与算法复习(一) 排序算法(I)

这篇文章将会介绍最常见的排序算法(使用 JavaScript 语言实现) PS:这里我会尽量使用语言无关的语法去写,大家不要太在意语言,重要的是算法的实现思路 1.冒泡排序 将数组分为有序区(左边)和无序区(右边) 每次从无序区的最后一个元素开始,一直向前冒泡到无序区的第一个位置,使其变成有序 function swap(A, i, j) { if (i === j) return [A[i], A[j]] = [A[j], A[i]] } function bubbleSort(A) { fo

复习排序算法

一. 冒泡排序算法 1.第一次排序时将序列[0 ~ n - 1]中从前往后进行两个相邻元素的比较,若前者较大则交换,比较n-1次;当第一趟排序结束时,序列最大的元素就被交换到位置n-1上,就如同一个气泡,一步一步往后翻滚,直到最后一位. 2.重复步骤1,在第i趟时需要翻滚n-i-1次,每趟决定一个元素的位置,一共需要n-1趟. 比如,初始序列: [1, 5, 4, 3, 2] 第1趟: [1, 4, 3, 2 ] 5 第2趟: [1, 3, 2 ] 4, 5 ...... - (void)bub

复习数据结构:排序算法(七)——桶排序

桶排序是一种稳定的排序方法,也是一种外排序. 桶排序的时间复杂度:最坏情况运行时间:当分布不均匀时,全部元素都分到一个桶中,则O(n^2),当然[算法导论8.4-2]也可以将插入排序换成堆排序.快速排序等,这样最坏情况就是O(nlgn).最好情况运行时间:O(n). 也就说,前面介绍的排序算法要么是O(n^2),要么是O(nlogn),只有桶排序是可能实现O(n)排序的,但是对数据是有要求的. 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续

复习数据结构:排序算法(八)——基排序

基排序是外排序,稳定的排序算法. 它的时间复杂度:O(d(r+n)),d为每个数的长度,r表示基数,n表示数组中元素的个数. 基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12. 104. 13. 7. 9 (1)按个位数排序是12.13.104.7.9 (2)再根据十位排序104.7.9.12.13 (3)再根据百位排序7.9.12.13.104 这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:07和09在十分