您的位置:

php插入法排序(PHP排序)

本文目录一览:

如何使用强大的PHP函数对数组进行排序

如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作。

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。

简单排序

首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:

Listing A

?php

 $data = array(5,8,1,7,2);

 sort($data);

 print_r($data);

 ?

输出结果如下所示:

Array ([0] = 1

[1] = 2

[2] = 5

[3] = 7

[4] = 8

)

也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。Listing B给我们展示了它的一个例子:

Listing B

?php $data = array(5,8,1,7,2);rsort($data); print_r($data);

?

它的输出结果如下:

Array ([0] = 8

[1] = 7

[2] = 5

[3] = 2

[4] = 1

)

根据关键字排序

当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是一个例子:

Listing C

?php $data = array("US" = "United States", "IN" = "India", "DE" = "Germany", "ES" = "Spain");ksort($data); print_r($data);

?

它的输出结果如下:

Array ([DE] = Germany

[ES] = Spain

[IN] = India

[US] = United States

)

Krsort()函数是根据关键字对数组进行倒排,Listing D就是这样的例子:

Listing D

?php $data = array("US" = "United States", "IN" = "India", "DE" = "Germany", "ES" = "Spain");krsort($data); print_r($data);

?

它的输出结果如下:

Array ([US] = United States

[IN] = India

[ES] = Spain

[DE] = Germany

)

根据值排序

如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所示:

Listing E

?php $data = array("US" = "United States", "IN" = "India", "DE" = "Germany", "ES" = "Spain");asort($data); print_r($data);

?

下面就是它的输出结果。请注意这个结果与上面使用ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进行排序的,但是它们是根据数组的不同字段进行排序的。

同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的一种方式,排序并不会改变它们的对应关系。

Array ([DE] = Germany

[IN] = India

[ES] = Spain

[US] = United States

)

现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。Listing F就是一个例子:

Listing F

?php $data = array("US" = "United States", "IN" = "India", "DE" = "Germany", "ES" = "Spain");arsort($data); print_r($data);

?

下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。

Array ([US] = United States

[ES] = Spain

[IN] = India

[DE] = Germany

)

自然语言排序

PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:

Listing G

?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);

natsort($data); print_r($data);?

它的输出结果如下:

Array ([0] = book-1

[1] = book-10

[2] = book-100

[3] = book-5

)

Array

(

[0] = book-1

[3] = book-5

[1] = book-10

[2] = book-100

)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。

自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:

Listing H

?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));

?

下面是它的输出结果:

Array ([0] = book-100

[1] = book-10

[2] = book-5

[3] = book-1

)

根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

Listing I

?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) strlen($b)) ? 1 : -1;

}

}

?

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:

Array ([0] = jay@zoo.tw

[1] = joe@host.com

[2] = john.doe@gh.co.uk

[3] = asmithsonian@us.info

)

自然语言排序

PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:

Listing G

?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);

natsort($data); print_r($data);?

它的输出结果如下:

Array ([0] = book-1

[1] = book-10

[2] = book-100

[3] = book-5

)

Array

(

[0] = book-1

[3] = book-5

[1] = book-10

[2] = book-100

)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。

自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:

Listing H

?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));

?

下面是它的输出结果:

Array ([0] = book-100

[1] = book-10

[2] = book-5

[3] = book-1

)

根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

Listing I

?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) strlen($b)) ? 1 : -1;

}

}

?

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:

Array ([0] = jay@zoo.tw

[1] = joe@host.com

[2] = john.doe@gh.co.uk

[3] = asmithsonian@us.info

)

多维排序

最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:

Listing J

?php $data = array(array("id" = 1, "name" = "Boney M", "rating" = 3),

array("id" = 2, "name" = "Take That", "rating" = 1),

array("id" = 3, "name" = "The Killers", "rating" = 4),

array("id" = 4, "name" = "Lusain", "rating" = 3),

); foreach ($data as $key = $value) {

$name[$key] = $value['name'];

$rating[$key] = $value['rating'];

}

array_multisort($rating, $name, $data); print_r($data);?

这里,我们在$data数组中模拟了一个行和列数组。然后,我使用array_multisort()函数对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下:

Array ([0] = Array

(

[id] = 2

[name] = Take That

[rating] = 1

) [1] = Array

(

[id] = 1

[name] = Boney M

[rating] = 3

)

[2] = Array

(

[id] = 4

[name] = Lusain

[rating] = 3

)

[3] = Array

(

[id] = 3

[name] = The Killers

[rating] = 4

)

)

array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。

这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。

最后,祝你能愉快的使用这些功能!

PHP中的快速排序算法如何实现倒序?

您好,这样的:

1. 冒泡排序法

* 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。

* 比如:2,4,1 // 第一次 冒出的泡是4

* 2,1,4 // 第二次 冒出的泡是 2

* 1,2,4 // 最后就变成这样

view sourceprint?

01.$arr=array(1,43,54,62,21,66,32,78,36,76,39);

02.function getpao($arr)

03.{

04.$len=count($arr);

05.//设置一个空数组 用来接收冒出来的泡

06.//该层循环控制 需要冒泡的轮数

07.for($i=1;$i$len;$i++)

08.{ //该层循环用来控制每轮 冒出一个数 需要比较的次数

09.for($k=0;$k$len-$i;$k++)

10.{

11.if($arr[$k]$arr[$k+1])

12.{

13.$tmp=$arr[$k+1];

14.$arr[$k+1]=$arr[$k];

15.$arr[$k]=$tmp;

16.}

17.}

18.}

19.return $arr;

20.}

2. 选择排序法:

选择排序法思路: 每次选择一个相应的元素,然后将其放到指定的位置

view sourceprint?

01.function select_sort($arr) {

02.//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数

03.//$i 当前最小值的位置, 需要参与比较的元素

04.for($i=0, $len=count($arr); $i$len-1; $i++) {

05.//先假设最小的值的位置

06.$p = $i;

07.//$j 当前都需要和哪些元素比较,$i 后边的。

08.for($j=$i+1; $j$len; $j++) {

09.//$arr[$p] 是 当前已知的最小值

10.if($arr[$p] $arr[$j]) {

11.//比较,发现更小的,记录下最小值的位置;并且在下次比较时,

12.// 应该采用已知的最小值进行比较。

13.$p = $j;

14.}

15.}

16.//已经确定了当前的最小值的位置,保存到$p中。

17.//如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可

18.if($p != $i) {

19.$tmp = $arr[$p];

20.$arr[$p] = $arr[$i];

21.$arr[$i] = $tmp;

22.}

23.}

24.//返回最终结果

25.return $arr;

26.}

3.插入排序法

插入排序法思路:将要排序的元素插入到已经 假定排序号的数组的指定位置。

view sourceprint?

01.function insert_sort($arr) {

02.//区分 哪部分是已经排序好的

03.//哪部分是没有排序的

04.//找到其中一个需要排序的元素

05.//这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素

06.//利用循环就可以标志出来

07.//i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,

08.//间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列

09.for($i=1, $len=count($arr); $i$len; $i++) {

10.//获得当前需要比较的元素值。

11.$tmp = $arr[$i];

12.//内层循环控制 比较 并 插入

13.for($j=$i-1;$j=0;$j--) {

14.//$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素

15.if($tmp $arr[$j]) {

16.//发现插入的元素要小,交换位置

17.//将后边的元素与前面的元素互换

18.$arr[$j+1] = $arr[$j];

19.//将前面的数设置为 当前需要交换的数

20.$arr[$j] = $tmp;

21.} else {

22.//如果碰到不需要移动的元素

23.//由于是已经排序好是数组,则前面的就不需要再次比较了。

24.break;

25.}

26.}

27.}

28.//将这个元素 插入到已经排序好的序列内。

29.//返回

30.return $arr;

31.}

4.快速排序法

view sourceprint?

01.function quick_sort($arr) {

02.//先判断是否需要继续进行

03.$length = count($arr);

04.if($length = 1) {

05.return $arr;

06.}

07.//如果没有返回,说明数组内的元素个数 多余1个,需要排序

08.//选择一个标尺

09.//选择第一个元素

10.$base_num = $arr[0];

11.//遍历 除了标尺外的所有元素,按照大小关系放入两个数组内

12.//初始化两个数组

13.$left_array = array();//小于标尺的

14.$right_array = array();//大于标尺的

15.for($i=1; $i$length; $i++) {

16.if($base_num $arr[$i]) {

17.//放入左边数组

18.$left_array[] = $arr[$i];

19.} else {

20.//放入右边

21.$right_array[] = $arr[$i];

22.}

23.}

24.//再分别对 左边 和 右边的数组进行相同的排序处理方式

25.//递归调用这个函数,并记录结果

26.$left_array = quick_sort($left_array);

27.$right_array = quick_sort($right_array);

28.//合并左边 标尺 右边

29.return array_merge($left_array, array($base_num), $right_array);

30.}

php排序问题

// 冒泡排序

function BubbleSort($arr) {

    // 获得数组总长度

    $num = count($arr);

    // 正向遍历数组

    for ($i = 1; $i  $num; $i++) {

        // 反向遍历

        for ($j = $num - 1; $j = $i ; $j--) {

            // 相邻两个数比较

            if ($arr[$j]  $arr[$j-1]) {

                // 暂存较小的数

                $iTemp = $arr[$j-1];

                // 把较大的放前面

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

                // 较小的放后面

                $arr[$j] = $iTemp;

            }

        }

    }

    return $arr;

}

// 交换法排序

function ExchangeSort($arr){

    $num = count($arr);

    // 遍历数组

    for ($i = 0;$i  $num - 1; $i++) {

        // 获得当前索引的下一个索引

        for ($j = $i + 1; $j  $num; $j++) {

            // 比较相邻两个的值大小

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

                // 暂存较小的数

                $iTemp = $arr[$i];

                // 把较大的放前面

                $arr[$i] = $arr[$j];

                // 较小的放后面

                $arr[$j] = $iTemp;

            }

        }

    }

    return $arr;

}

// 选择法排序

function SelectSort($arr) {

    // 获得数组总长度

    $num = count($arr);

    // 遍历数组

    for ($i = 0;$i  $num-1; $i++) {

        // 暂存当前值

        $iTemp = $arr[$i];

        // 暂存当前位置

        $iPos = $i;

        // 遍历当前位置以后的数据

        for ($j = $i + 1;$j  $num; $j++){

            // 如果有小于当前值的

            if ($arr[$j]  $iTemp) {

                // 暂存最小值

                $iTemp = $arr[$j];

                // 暂存位置

                $iPos = $j;

            }

        }

        // 把当前值放到算好的位置

        $arr[$iPos] = $arr[$i];

        // 把当前值换成算好的值

        $arr[$i] = $iTemp;

    }

    return $arr;

}

// 插入法排序

function InsertSort($arr){

    $num = count($arr);

    // 遍历数组

    for ($i = 1;$i  $num; $i++) {

        // 获得当前值

        $iTemp = $arr[$i];

        // 获得当前值的前一个位置

        $iPos = $i - 1;

        // 如果当前值小于前一个值切未到数组开始位置

        while (($iPos = 0)  ($iTemp  $arr[$iPos])) {

            // 把前一个的值往后放一位

            $arr[$iPos + 1] = $arr[$iPos];

            // 位置递减

            $iPos--;

        }

        $arr[$iPos+1] = $iTemp;

    }

    return $arr;

}

// 快速排序

function QuickSort($arr){

    $num = count($arr);

    $l = $r = 0;

    $left = $right = array();

    // 从索引的第二个开始遍历数组

    for ($i = 1;$i  $num; $i++) {

        // 如果值小于索引1

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

            // 装入左索引数组(小于索引1的数据)

            $left[] = $arr[$i];

            $l++;

        } else {

            // 否则装入右索引中(大于索引1的数据)

            $right[] = $arr[$i];

            $r++; //

        }       

    }

    // 如果左索引有值 则对左索引排序

    if($l  1) {

        $left = QuickSort($left);

    }

    // 排序后的数组

    $new_arr = $left;

    // 将当前数组第一个放到最后

    $new_arr[] = $arr[0];

    // 如果又索引有值 则对右索引排序

    if ($r  1) {

        $right = QuickSort($right);

    }

    // 根据右索引的长度再次增加数据

    for($i = 0;$i  $r; $i++) {

        $new_arr[] = $right[$i];

    }

    return $new_arr;

}

求助php二维数组的排序

第一种方法:传说中的冒泡法

function arraysort($data, $order = 'asc') {

//asc升序 desc降序

$temp = array ();

$count = count ( $data );

if ($count = 0)

return false; //传入的数据不正确

if ($order == 'asc') {

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

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

if ($data [$j] $data [$j - 1]) {

//交换两个数据的位置

$temp = $data [$j];

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

$data [$j - 1] = $temp;

}

}

}

} else {

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

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

if ($data [$j] $data [$j - 1]) {

$temp = $data [$j];

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

$data [$j - 1] = $temp;

}

}

}

}

return $data;

}

$data = array (7, 5, 3, 8, 9, 1, 5, 3, 1, 24, 3, 87, 0, 33, 1, 12, 34, 54, 66, 32 );

var_dump ( arraysort ( $data ) ); //升序

echo ('br');

var_dump ( arraysort ( $data ,'desc') );//降序

第二种方法:不知道取个什么名字好,就叫插入法吧!囧

function arraysort3($data, $order = 'asc') {

//目前只做升序排列

$count = count ( $data );

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

$temp = $data [$i];

$j = $i - 1;

while ( $data [$j] $temp ) {

$data [$j + 1] = $data [$j];

$data [$j] = $temp;

$j --;//为什么要递减:从高位逐位判断

}

}

return $data;

}

$data = array (7, 5, 3, 8, 9, 1, 5, 3, 1, 24, 3, 87, 0, 33, 1, 12, 34, 54, 66, 32 );

var_dump ( arraysort3 ( $data ) ); //升序

至于打印前十个就不用说了吧 for循环就行

PHP实现常见的排序算法

注:为方便描述,下面的排序全为正序(从小到大排序)

假设有一个数组[a,b,c,d]

冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变。具体步骤:

1,比较a,b这两个元素,如果ab,则交换位置,数组变为:[b,a,c,d]

2,比较a,c这两个元素,如果ac,则位置不变,数组变为:[b,a,c,d]

3,比较c,d这两个元素,如果cd,则交换位置,数组变为:[b,a,d,c]

完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了。

第二轮比较结束后,第二大的数也会冒到倒数第二的位置。

依次类推,再进行第三轮,,,

就这样最大的数一直往后排(冒),最后完成排序。所以我们称这种排序算法为冒泡排序。

选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面。具体步骤如下:

插入排序步骤大致如下:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

步骤:

从数列中挑出一个元素,称为 “基准”(pivot),

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。