您的位置:首页 > 其它

插入排序,希尔排序,选择排序详解以及消耗存储比较

2016-03-27 19:57 661 查看
插入排序,希尔排序,选择排序详解以及消耗存储比较

$arr=array(2,8,4,6,7,1,9,20,13); //待排序的数组
//插入排序
//从小到大
/*
思路
2,7,4,1
从第二个元素开始
1.比较7与2,因为7>2,故不移动位置
2,7,4,1
2.比较4与7,因为4<7,故将第二个元素移动第三个元素的位置(向后移动一位)
2,7,7,1
3.比较4与2的大小,因为4>2,故不移动位置,将4放到第二个位置上
2,4,7,1
4.比较1与7的大小,因为1<7,将7移动到1的位置上(向后移动一位)
2,4,7,7
比较1与4的大小,1<4,将4向后移动一位
2,4,4,7
比较1与2的大小,1<2,将2向后移动一位
2,2,4,7
将4放置到第一位
1,2,4,7
*/
/**
*params array $arr待排序数组
*/
function insertSort($arr){
$len=count($arr);
if($len ==1){
return $arr;
}
for ($i=1; $i <$len ; $i++) {
$j=$i;
$nextElement=$arr[$j];
while ($j>0 && $nextElement<$arr[$j-1]) {
$arr[$j]=$arr[$j-1];
--$j;
}
$arr[$j]=$nextElement;
}
return $arr;
}
$startMemoryUsed=memory_get_usage();
var_dump(insertSort($arr));
$endMemoryUsed=memory_get_usage();
$usedMemory=($endMemoryUsed-$startMemoryUsed)/1024;
var_dump('插入排序消耗内存为:'.$usedMemory.'MB');

//希尔排序
/*思路:
关键是在于确定k值,即分组后每个组内元素个数
在程序设计中,一般最开始分两组,然后逐渐递减半
8 3 4 1 6 9 5 7
分两组k=8/2=4,每组四个
(8 3 4 1) (6 9 5 7)
最后一组的某一个位置上的数字与前面相对应位置上的数字比较
6与8比较
(6 3 4 1) (8 9 5 7)
9与3比较
(6 3 4 1) (8 9 5 7)
5与4比较
(6 3 4 1) (8 9 5 7)
7与1比较
(6 3 4 1) (8 9 5 7)

k=4/2=2,每组两个
(6 3) (4 1) (8 9) (5 7)
4与6比较
(4 3) (6 1) (8 9) (5 7)
1与3比较
(4 1) (6 3) (8 9) (5 7)
8与6比较
(4 1) (6 3) (8 9) (5 7)
9与3比较
(4 1) (6 3) (8 9) (5 7)
5与8比较
(4 1) (6 3) (8 9) (8 7)
5与6比较
(4 1) (6 3) (6 9) (8 7)
5与4比较
(4 1) (5 3) (6 9) (8 7)
7与9比较
(4 1) (5 3) (6 9) (8 9)
7与3比较
(4 1) (5 3) (6 7) (8 9)

k=2/2=1,每组1个
4 1 5 3 6 7 8 9
1与4比较
1 4 5 3 6 7 8 9
5与4比较
1 4 5 3 6 7 8 9
3与5比较
1 4 5 5 6 7 8 9
3与4比较
1 4 4 5 6 7 8 9
3与1比较
1 3 4 5 6 7 8 9
6与5比较
1 3 4 5 6 7 8 9
7与6比较
1 3 4 5 6 7 8 9
8与7比较
1 3 4 5 6 7 8 9
9与3比较
1 3 4 5 6 7 8 9
k=1/2=0,结束循环
*/
function shellSort($arr){
$len=count($arr);//数组长度
$k=(int)($len/2); //分组长度
while($k>0){
for ($i=$k; $i <$len ; $i++) {
$j=$i-$k;
$curValue=$arr[$i];
while ( $j>=0 && $arr[$j]>$curValue) {
$arr[$j+$k]=$arr[$j];
$j=$j-$k;
}
$arr[$j+$k]=$curValue;
}
$k=(int)($k/2);
}
return $arr;
}

$startMemoryUsed=memory_get_usage();
var_dump(shellSort($arr));
$endMemoryUsed=memory_get_usage();
$usedMemory=($endMemoryUsed-$startMemoryUsed)/1024;
var_dump('希尔排序消耗内存为:'.$usedMemory.'MB');

//选择排序
//思路:依次从线性表中找到最小的元素,插入到元素的最开始位置,然后从剩下的线性表中,找到最小元素,循环查找,一直到查处的列表为空为止。
/*
8 3 4 1 6 9 5 7
从该列表中找出最小数1,放置在第一个位置
1 3 4 8 6 9 5 7
从3 4 8 6 9 5 7找出最小元素3,放置在第二个位置
1 3 4 8 6 9 5 7
从4 8 6 9 5 7找出最小元素4,放置在第3个位置
1 3 4 8 6 9 5 7
从8 6 9 5 7找出最小元素5,放置在第4个位置
1 3 4 5 6 9 8 7
从8 6 9 5 7找出最小元素6,放置在第5个位置
1 3 4 5 6 9 8 7
从8 6 9 5 7找出最小元素7,放置在第6个位置
1 3 4 5 6 7 8 9
从8 6 9 5 7找出最小元素8,放置在第7个位置
1 3 4 5 6 7 8 9
从8 6 9 5 7找出最小元素9,放置在第8个位置
1 3 4 5 6 7 8 9
*/
//选择排序
function selectSort($arr){
$len=count($arr);//数组长度
for ($i=0; $i < $len; $i++) {
$j=$i+1;
$minIndex=$i;
while ( $j<$len) {
if($arr[$j]<$arr[$i]){
$minIndex=$j;
}
++$j;
}
if($i !=$minIndex){
//使用异或交互变量,节省内存消耗
$arr[$minIndex]=$arr[$minIndex]^$arr[$i];
$arr[$i]=$arr[$minIndex]^$arr[$i];
$arr[$minIndex]=$arr[$minIndex]^$arr[$i];
}
}
return $arr;
}

$startMemoryUsed=memory_get_usage();
var_dump(selectSort($arr));
$endMemoryUsed=memory_get_usage();
$usedMemory=($endMemoryUsed-$startMemoryUsed)/1024;
var_dump('选择排序消耗内存为:'.$usedMemory.'MB');


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: