数组的排序函数

冒泡排序

概念什么的都省略了,毕竟姐是搞ACM的人(得意  ,直接贴代码
<?php
	$arr = array(0,1,22,3,44,5,6,7,88,9);



	//从大到小


function mysort(&$arr) {	

	$len = count($arr);
	
	for($i=0; $i<$len-1; $i++) {
		for($j = 0; $j < $len-$i-1; $j++) {
			if($arr[$j] > $arr[$j+1]) {
				$tmp = $arr[$j];

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

				$arr[$j+1] = $tmp;
			}

		}
	}

	
}

mysort($arr);

print_r($arr);

快速排序

20世纪最伟大的十个算法第一~~课件上说这是分治法,纠结要不要听他讲算法~。~简单瞅了几眼,唤起了我沉睡的关于排序的回忆~快排这玩意时间真的不好说,跟最开始选的数关系太大了,形成二叉排序树之后,中序遍历一遍就好了。早知道就不看这节讲解的视频,直接看代码了==

我爱优雅的递归~~
看这个中间的代码:
<?php
	$arr=array(20,18,33,17,44,15,22,13,25,34,11,18,66);
	function qsort($arr){
		if(!is_array($arr)||empty($arr))
			return array();//返回空数组;
		$len=count($arr);
		if($len<=1) return $arr;
		$key=$arr[0];
		$left=array();
		$right=array();
		for($i=1;$i<$len;$i++){
			if($arr[$i]<=$key)$left[]=$arr[$i];
			else $right[]=$arr[$i];
		}
		print_r($left);
		echo '<br>';
		print_r($right);
		echo '<br>';
		qsort($left);
		qsort($right);
	}
	print_r($arr);
	echo '<br>';
	print_r(qsort($arr));

输出:
Array ( [0] => 20 [1] => 18 [2] => 33 [3] => 17 [4] => 44 [5] => 15 [6] => 22 [7] => 13 [8] => 25 [9] => 34 [10] => 11 [11] => 18 [12] => 66 ) 
Array ( [0] => 18 [1] => 17 [2] => 15 [3] => 13 [4] => 11 [5] => 18 ) 
Array ( [0] => 33 [1] => 44 [2] => 22 [3] => 25 [4] => 34 [5] => 66 ) 
Array ( [0] => 17 [1] => 15 [2] => 13 [3] => 11 [4] => 18 ) 
Array ( ) 
Array ( [0] => 15 [1] => 13 [2] => 11 ) 
Array ( [0] => 18 ) 
Array ( [0] => 13 [1] => 11 ) 
Array ( ) 
Array ( [0] => 11 ) 
Array ( ) 
Array ( [0] => 22 [1] => 25 ) 
Array ( [0] => 44 [1] => 34 [2] => 66 ) 
Array ( ) 
Array ( [0] => 25 ) 
Array ( [0] => 34 ) 
Array ( [0] => 66 ) 
终极版:
<?php
	$arr=array(20,18,33,17,44,15,22,13,25,34,11,18,66);
	function qsort($arr){
		if(!is_array($arr)||empty($arr))
			return array();//返回空数组;
		$len=count($arr);
		if($len<=1) return $arr;
		$key[0]=$arr[0];///
		$left=array();
		$right=array();
		for($i=1;$i<$len;$i++){
			if($arr[$i]<=$key[0])$left[]=$arr[$i];
			else $right[]=$arr[$i];
		}
		print_r($left);
		echo '<br>';
		print_r($right);
		echo '<br>';
		$left=qsort($left);
		$right=qsort($right);
		return array_merge($left,$key,$right);
	}
	print_r($arr);
	echo '<br>';
	print_r(qsort($arr));
注意那个key应该用数组,因为merge是合并数组
输出:
Array ( [0] => 20 [1] => 18 [2] => 33 [3] => 17 [4] => 44 [5] => 15 [6] => 22 [7] => 13 [8] => 25 [9] => 34 [10] => 11 [11] => 18 [12] => 66 ) 
Array ( [0] => 18 [1] => 17 [2] => 15 [3] => 13 [4] => 11 [5] => 18 ) 
Array ( [0] => 33 [1] => 44 [2] => 22 [3] => 25 [4] => 34 [5] => 66 ) 
Array ( [0] => 17 [1] => 15 [2] => 13 [3] => 11 [4] => 18 ) 
Array ( ) 
Array ( [0] => 15 [1] => 13 [2] => 11 ) 
Array ( [0] => 18 ) 
Array ( [0] => 13 [1] => 11 ) 
Array ( ) 
Array ( [0] => 11 ) 
Array ( ) 
Array ( [0] => 22 [1] => 25 ) 
Array ( [0] => 44 [1] => 34 [2] => 66 ) 
Array ( ) 
Array ( [0] => 25 ) 
Array ( [0] => 34 ) 
Array ( [0] => 66 ) 
Array ( [0] => 11 [1] => 13 [2] => 15 [3] => 17 [4] => 18 [5] => 18 [6] => 20 [7] => 22 [8] => 25 [9] => 33 [10] => 34 [11] => 44 [12] => 66 )
弱弱的吐槽一下,这玩意哪里不好理解了==(森森的成就感。反正php里面都有这些内置函数,据说掌握这玩意能提高思维,呵呵呵

sort -- 对数组排序(升序)


rsort -- 对数组逆向排序(降序)

<?php
//	$arr = array(1, 2, 3, 5,4,8,7,9,6,0);


	$arr = array("one", "two", 100=>"three", "four", "five");

	print_r($arr);
	echo '<br>';

	rsort($arr);

	print_r($arr);
	echo '<br>';


ksort -- 对数组按照键名排序

<?php
	$arr=array(3=>"fighting",1=>"MissZhou",2=>"willing");
	ksort($arr);
	print_r($arr);

输出:

Array ( [1] => MissZhou [2] => willing [3] => fighting )废话么

krsort -- 对数组按照键名逆向排序


asort -- 对数组进行排序并保持索引关系(关联数组排序)


<?php
	$lamp=array("l"=>"linux","a"=>"apache","m"=>"mysql","p"=>"php");
	print_r($lamp);
	echo '<br>';
	sort($lamp);
	print_r($lamp);
	$lamp=array("l"=>"linux","a"=>"apache","m"=>"mysql","p"=>"php");
	echo '<br>';
	asort($lamp);
	print_r($lamp);
	echo '<br>';



Array ( [l] => linux [a] => apache [m] => mysql [p] => php ) 
Array ( [0] => apache [1] => linux [2] => mysql [3] => php ) 
Array ( [a] => apache [l] => linux [m] => mysql [p] => php ) 


arsort --  对数组进行逆向排序并保持索引关系 



natsort --  用“自然排序”算法对数组排序

<?php
	$a=array("file1.txt","file11.txt","file2.txt");
	print_r($a);
	echo '<br>';
	natsort($a);
	print_r($a);

Array ( [0] => file1.txt [1] => file11.txt [2] => file2.txt ) 

Array ( [0] => file1.txt [2] => file2.txt [1] => file11.txt )

natcasesort --  用“自然排序”算法对数组进行不区分大小写字母的排序 
<?php
	$a=array("File1.txt","File11.txt","file2.txt");
	print_r($a);
	echo '<br>';
	natsort($a);
	print_r($a);
	echo '<br>';
	natcasesort($a);
	print_r($a);
	echo '<br>';

输出:

Array ( [0] => File1.txt [1] => File11.txt [2] => file2.txt ) 
Array ( [0] => File1.txt [1] => File11.txt [2] => file2.txt ) 
Array ( [0] => File1.txt [2] => file2.txt [1] => File11.txt ) 

usort --  使用用户自定义的比较函数对数组中的值进行排序

说什么来什么,当初我学回调函数的时候就想到了排序时候的已定义函数(得意。

<?php
	$arr=array("1111","111111","111","1");
	print_r($arr);
	echo '<br>';
	usort($arr,function($a,$b){
		$alen=strlen($a);
		$blen=strlen($b);
		if($alen>$blen)return 1;
		else if($alen<$blen) return -1;
		else return 0;
	});
	print_r($arr);


Array ( [0] => 1111 [1] => 111111 [2] => 111 [3] => 1 ) 
Array ( [0] => 1 [1] => 111 [2] => 1111 [3] => 111111 )

uasort --  使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
<?php
	$arr=array("1111","111111","111","1");
	print_r($arr);
	echo '<br>';
	uasort($arr,function($a,$b){
		$alen=strlen($a);
		$blen=strlen($b);
		if($alen>$blen)return 1;
		else if($alen<$blen) return -1;
		else return 0;
	});
	print_r($arr);


Array ( [0] => 1111 [1] => 111111 [2] => 111 [3] => 1 ) 
Array ( [3] => 1 [2] => 111 [0] => 1111 [1] => 111111 )

uksort --  使用用户自定义的比较函数对数组中的键名进行排序

array_multisort -- 对多个数组或多维数组进行排序

复杂的数组函数~~好神奇,看了半天才明白==灰常灰常强大~~~

<?php
	$a=array("a",10,"b",20);
	$b=array(1,4,3,2);
	array_multisort($a,SORT_DESC,$b,SORT_ASC);
	print_r($a);
	echo '<br>';
	print_r($b);

猜猜输出什么:

Array ( [0] => 20 [1] => 10 [2] => b [3] => a ) 
Array ( [0] => 2 [1] => 4 [2] => 3 [3] => 1 )

再看一个微微复杂的栗子~传入多个数组

<?php
	$data = array(
		
			array("id"=>1, "name"=>"aa", "age"=>10),
			array("id"=>2, "name"=>"ww", "age"=>30),
			array("id"=>3, "name"=>"cc", "age"=>30),
			array("id"=>4, "name"=>"dd", "age"=>"40")
		
		);
	$ages=array();
	$names=array();
	foreach($data as $value){
		$ages[]=$value['age'];
		$names[]=$value['name'];
	}
	array_multisort($ages,SORT_DESC,$names,$data);
	echo '<pre>';
	print_r($data);
	echo '</pre>';

就是按ages降序,names升序来排列date这个数组。嗯,机智如我早就想到了PHP中的数组可以达到c中结构体的作用,伟大的array_multisort()又替代了cmp的排序比较。PHP是最好的语言~~~

所以输出:

Array
(
    [0] => Array
        (
            [id] => 4
            [name] => dd
            [age] => 40
        )

    [1] => Array
        (
            [id] => 3
            [name] => cc
            [age] => 30
        )

    [2] => Array
        (
            [id] => 2
            [name] => ww
            [age] => 30
        )

    [3] => Array
        (
            [id] => 1
            [name] => aa
            [age] => 10
        )

)

拆分、合并、分解与结合数组

array_slice -- 从数组中取出一段 

语法: array array_slice ( array array, int offset [, int length [, bool preserve_keys]] ) 
array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。 
如果 offset 非负,则序列将从 array 中的此偏移量开始。如果 offset 为负,则序列将从 array 中距离末端这么远的地方开始。 
如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从 offset 开始一直到 array 的末端。 

<?php
	$arr=array('a','b','c','d','e');
	$narr=array_slice($arr,-3,2,true);
	print_r($narr);
true保留下标
Array ( [2] => c [3] => d )

array_splice --  把数组中的一部分去掉并用其它值取代 

语法:array array_splice ( array &input, int offset [, int length [, array replacement]] ) 注意是引用类型的啊啊啊啊啊啊啊~。~
array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留。 
如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。 
如果省略 length,则移除数组中从 offset 到结尾的所有部分。
如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。

<?php
	$arr=array('a','b','c','d','e');
	//$narr=array_slice($arr,-3,2,true);
	array_splice($arr,2,2);
	print_r($arr);

Array ( [0] => a [1] => b [2] => e ) 保留没删的
<?php
	$arr=array('a','b','c','d','e');
	//$narr=array_slice($arr,-3,2,true);
	array_splice($arr,-3,2,"hello");
	print_r($arr);

Array ( [0] => a [1] => b [2] => hello [3] => e )
替换多维:
<?php
	$arr=array('a','b','c','d','e');
	//$narr=array_slice($arr,-3,2,true);
	array_splice($arr,-3,2,array("hello","world"));
	print_r($arr);

Array ( [0] => a [1] => b [2] => hello [3] => world [4] => e )

array_combine --  创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 

语法:array array_combine ( array keys, array values )
返回一个 array,用来自 keys 数组的值作为键名,来自 values 数组的值作为相应的值。 
如果两个数组的单元数不同或者数组为空时返回 FALSE。 
<?php
	$arr=array(1,2,3,4);
	$brr=array("MissZhou","必须","好好","努力");
	echo '<pre>';
	print_r(array_combine($arr,$brr));
	echo '</pre>';

Array
(
    [1] => MissZhou
    [2] => 必须
    [3] => 好好
    [4] => 努力
)
上下个数必须对应!

array_merge -- 合并一个或多个数组 

语法: array array_merge ( array array1 [, array array2 [, array ...]] )
array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。 
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。 
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。 

是不是想到+运算符啦~之前不是常用嘛 然而在PHP整数可以这么用,数组不可以哟,+的特点是下标相同会覆盖,而且前面覆盖后面的╮(╯_╰)╭但是你可以事前调下标再相加啊
<?php
	$arr=array("one"=>"a","b","c");
	$brr=array("one"=>1,"two"=>2,"three"=>3);
	$c=array_merge($arr,$brr);
	var_dump($c);

array (size=5)
  'one' =>  1
  0 =>  'b' (length=1)
  1 =>  'c' (length=1)
  'two' =>  2
  'three' =>  3
猜猜只有一个数组的呢??
<?php
	$arr=array("a",5=>"b","c");
	$brr=array("one"=>1,"two"=>2,"three"=>3);
	$c=array_merge($arr);
	var_dump($c);

array (size=3)
  0 =>  'a' (length=1)
  1 =>  'b' (length=1)
  2 =>  'c' (length=1)

array_intersect -- 计算数组的交集 

语法 array array_intersect ( array array1, array array2 [, array ...] )
array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。
<?php
	$a=array(1,2,3,4);
	$b=array(3,4,5,6);
	print_r(array_intersect($a,$b));

Array ( [2] => 3 [3] => 4 )

array_diff -- 计算数组的差集 

语法:array array_diff ( array array1, array array2 [, array ...] )
array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。
<?php
	$a=array(1,2,3,4);
	$b=array(3,4,5,6);
	//print_r(array_intersect($a,$b));
	print_r(array_diff($a,$b));
	print_r(array_diff($b,$a));

Array ( [0] => 1 [1] => 2 ) Array ( [2] => 5 [3] => 6 )

数组与数据结构

array_pop -- 将数组最后一个单元弹出(出栈) 

语法:mixed array_pop ( array &array )
array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。 


array_push --  将一个或多个单元压入数组的末尾(入栈) 

语法:int array_push ( array &array, mixed var [, mixed ...] )
array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。
<?php
	$zhan = array();

	array_push($zhan, "1");
	array_push($zhan, "2");
	array_push($zhan, "3", 4, 5,6);


	echo array_pop($zhan)."<br>";
	echo array_pop($zhan)."<br>";
	echo array_pop($zhan)."<br>";

	print_r($zhan);

6
5
4
Array ( [0] => 1 [1] => 2 [2] => 3 )

array_shift --  将数组开头的单元移出数组 

语法:mixed array_shift ( array &array )
array_shift() 将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。如果 array 为空(或者不是数组),则返回 NULL。

array_unshift --  在数组开头插入一个或多个单元 

语法: int array_unshift ( array &array, mixed var [, mixed ...] )
array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。 

p.s.话说我就觉得PHP这么高大上的成熟语言应该有“优先队列”这种便捷的东西,不过需要用类~而且从下面的栗子可以看出来PHP的数组是不判重的,貌似之前说过吧,去重的数组函数

<?php
	$queue=array();
	array_unshift($queue,1);
	array_unshift($queue,1);
	array_unshift($queue,2);
	array_unshift($queue,3,4,5);
	echo array_pop($queue).'<br>';
	print_r($queue);

1
Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 2 [4] => 1 )
<?php
	$queue=array();
	array_unshift($queue,1);
	array_unshift($queue,1);
	array_unshift($queue,2);
	array_unshift($queue,3,4,5);
	echo array_shift($queue).'<br>';
	print_r($queue);

3
Array ( [0] => 4 [1] => 5 [2] => 2 [3] => 1 [4] => 1 )


其他有用的数组处理函数


array_rand --  从数组中随机取出一个或多个单元 

返回下标~~
<?php
	$arr=array(1,2,3,4,5);
	var_dump(array_rand($arr));

也是根据种子(时间)
<?php
	$arr=array(1,2,3,4,5);
	var_dump(array_rand($arr,2));

array (size=2)
  0 =>  2
  1 =>  3
面试题:
    以下代码的执行后是,$result值为:
            <?php
$srcArray=array(‘a’,’b’,’c’,’d’);
$randValue=array_rand($srcArray);
$result=is_string($randValue);
?>
A、a
B、false
C、true b
D、b
E、c
输出:
 false


shuffle -- 将数组打乱 

<?php
	$arr=array(1,2,3,4,5);
	shuffle($arr);
	print_r($arr);

Array ( [0] => 4 [1] => 3 [2] => 1 [3] => 2 [4] => 5 )

Array_sum()

统计数组中元素的和

<?php
	$arr=array(1,2,3,4,5);
	echo array_sum($arr);


Range()

初始化数组用,(最小值,最大值)
<?php
	$arr=range(4,10);
	print_r($arr);

Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 [4] => 8 [5] => 9 [6] => 10 )
<?php
	$arr=range(24,10);
	print_r($arr);

Array ( [0] => 24 [1] => 23 [2] => 22 [3] => 21 [4] => 20 [5] => 19 [6] => 18 [7] => 17 [8] => 16 [9] => 15 [10] => 14 [11] => 13 [12] => 12 [13] => 11 [14] => 10 )

Array_fill()


<?php
	$arr=array_fill(4,10,"加油");
	print_r($arr);

Array ( [4] => 加油 [5] => 加油 [6] => 加油 [7] => 加油 [8] => 加油 [9] => 加油 [10] => 加油 [11] => 加油 [12] => 加油 [13] => 加油 )