搜索了哈php冒泡排序,网上写的不知道第二层循环都是递减的,很不符合我的习惯,既然是冒泡肯定是从下往上啊,所以索性自己写了个分享哈!
<?php
$ar = array(1,3,2,8,3,5,6,10,13,27,24);
bubble_sort($ar);
print_r($ar);
function bubble_sort(&$ar)
{
$ar_count = count($ar);
$temp = null;
for($i= 0 ; $i < $ar_count; $i ++)
{
for($j = 0 ; $j < $ar_count - $i - 1; $j++)
{
if($ar[$j] > $ar[$j+1])
{
$temp = $ar[$j];
$ar[$j] = $ar[$j+1];
$ar[$j+1] = $temp;
}
}
}
}
php冒泡排序
<?php
$ar = array(1,3,2,8,3,5,6,10,13,27,24);
bubble_sort($ar);
print_r($ar);
function bubble_sort(&$ar)
{
$ar_count = count($ar);
$temp = null;
for($i= 0 ; $i < $ar_count; $i ++)
{
for($j = 0 ; $j < $ar_count - $i - 1; $j++)
{
if($ar[$j] > $ar[$j+1])
{
$temp = $ar[$j];
$ar[$j] = $ar[$j+1];
$ar[$j+1] = $temp;
}
}
}
}
php冒泡排序
bubble_sort($ar);function bubble_sort(&$ar)
{
$ar_count = count($ar);
$temp = null;
for($i= 0 ; $i < $ar_count; $i ++)
{
for($j = 0 ; $j < $ar_count - $i - 1; $j++)
{
if($ar[$j] > $ar[$j+1])
{
$temp = $ar[$j];
$ar[$j] = $ar[$j+1];
$ar[$j+1] = $temp;
}
}
echo join(',', $ar), PHP_EOL; //观察这里的输出
}
}1,3,2,8,3,5,6,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27 到这里排序已经结束
1,2,3,3,5,6,8,10,13,24,27 从这里开始,以下都是无效劳动
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27大有优化的余地
不过我这个只是面试时候对付哈别人出面试题,貌似网上写的排序算法都不是太好懂,所以才这样写,囧 实际项目中不会拿php做算法啊
但是还是想问哈 你有什么好的优化建议?
zend_qsort.cstatic void _zend_qsort_swap(void *a, void *b, size_t siz)
{
register char *tmp_a_char;
register char *tmp_b_char;
register int *tmp_a_int;
register int *tmp_b_int;
register size_t i;
int t_i;
char t_c; tmp_a_int = (int *) a;
tmp_b_int = (int *) b; for (i = sizeof(int); i <= siz; i += sizeof(int)) {
t_i = *tmp_a_int;
*tmp_a_int++ = *tmp_b_int;
*tmp_b_int++ = t_i;
} tmp_a_char = (char *) tmp_a_int;
tmp_b_char = (char *) tmp_b_int; for (i = i - sizeof(int) + 1; i <= siz; ++i) {
t_c = *tmp_a_char;
*tmp_a_char++ = *tmp_b_char;
*tmp_b_char++ = t_c;
}
}ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC)
{
void *begin_stack[QSORT_STACK_SIZE];
void *end_stack[QSORT_STACK_SIZE];
register char *begin;
register char *end;
register char *seg1;
register char *seg2;
register char *seg2p;
register int loop;
uint offset; begin_stack[0] = (char *) base;
end_stack[0] = (char *) base + ((nmemb - 1) * siz); for (loop = 0; loop >= 0; --loop) {
begin = begin_stack[loop];
end = end_stack[loop]; while (begin < end) {
offset = (end - begin) >> 1;
_zend_qsort_swap(begin, begin + (offset - (offset % siz)), siz); seg1 = begin + siz;
seg2 = end; while (1) {
for (; seg1 < seg2 && compare(begin, seg1 TSRMLS_CC) > 0;
seg1 += siz); for (; seg2 >= seg1 && compare(seg2, begin TSRMLS_CC) > 0;
seg2 -= siz);
if (seg1 >= seg2)
break;
_zend_qsort_swap(seg1, seg2, siz); seg1 += siz;
seg2 -= siz;
} _zend_qsort_swap(begin, seg2, siz); seg2p = seg2;
if ((seg2p - begin) <= (end - seg2p)) {
if ((seg2p + siz) < end) {
begin_stack[loop] = seg2p + siz;
end_stack[loop++] = end;
}
end = seg2p - siz;
}
else {
if ((seg2p - siz) > begin) {
begin_stack[loop] = begin;
end_stack[loop++] = seg2p - siz;
}
begin = seg2p + siz;
}
}
}
}
$ar[$j]^=$ar[$j+1]^=$ar[$j]^=$ar[$j+1];
1,2,3,3,5,6,8,10,13,24,27
1,2,3,3,5,6,8,10,13,24,27
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 3
[4] => 5
[5] => 6
[6] => 8
[7] => 10
[8] => 13
[9] => 24
[10] => 27
)
<?php
$ar = array(1,3,2,8,3,5,6,10,13,27,24);
bubble_sort($ar);
print_r($ar);
function bubble_sort(&$ar)
{
$ar_count = count($ar);
$temp = null;
for($i= 0 ; $i < $ar_count; $i ++)
{
$flag = true;
for($j = 0 ; $j < $ar_count - $i - 1; $j++)
{
if($ar[$j] > $ar[$j+1])
{
$flag = false;
$temp = $ar[$j];
$ar[$j] = $ar[$j+1];
$ar[$j+1] = $temp;
}
}
echo join(',', $ar), PHP_EOL;
if($flag)
return;
}
}