您的位置:首页 > 编程语言 > PHP开发

四基础排序算法:插入排序、选择排序、冒泡排序、快速排序

2015-03-01 10:18 459 查看
/**
* 插入排序(Insertion Sort)的基本思想是:
* 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
* 插入排序:就是把第一个数当成已排序还的序列,然后把后面的数一个一个插入到前面适当的位置
*/
function insert_sort($arr){
//计算数组元素个数
$total_count = count($arr);

if($total_count <= 0) return 0;

//从这里开始循环 从1开始,表示把序列的第一个元素当成有序序列
for ($i = 1; $i < $total_count; $i++) {

$current = $arr[$i];

$j = $i - 1 ;
//$current 在while循环里面,值一直没有变化,只是位置有变化
while ($current < $arr[$j]) {
$arr[$j+1] = $arr[$j] ;
$arr[$j] = $current;
$j--;
if($j < 0) break;
}
}
return $arr;
}
/**
* 选择排序(Selection Sort)的基本思想是:
* 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
* 选择排序:每次都选出最小的一个放在最前面,最开始的时候把第一个当做最小的
*/
function select_sort($arr){
$total_count = count($arr);

if($total_count <= 0) return 0;

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

//拿第一个后面的每一个与第一比,每次比完都是把小的放在第一个的位置 ,比完内层的这个for循环,就选出了最小的一个
for ($j = $i + 1 ; $j < $total_count; $j++) {

$f = $i;

if($arr[$f] > $arr[$j]){
$f = $j;
}
if($f != $i){ //如果不等于,表示上一个if 发生了

$temp = $arr[$i];

$arr[$i] = $arr[$f];

$arr[$f] =  $temp;
}

}
}

return $arr;
}

/**
* 冒泡排序的基本思想是:
* 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止
*/
function bubble_sort($arr){

$total_count = count($arr);

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

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

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

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

return $arr;
}

/**
* 看看就会明白
*/
function quick_sort($arr){

$total_count = count($arr);

if($total_count <= 1) return $arr;

$middle = $arr[0];
$left_arr = $right_arr = array();
for ($i=1; $i < $total_count; $i++) {

if($arr[$i] > $middle){

$right_arr[] = $arr[$i];

}else{

$left_arr[] = $arr[$i];
}
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);

return array_merge($left_arr , array($middle) , $right_arr);
}

参考:http://www.nowamagic.net/librarys/veda/detail/761
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐