【数据结构】交换排序

交换排序的基本思想是:

两两比较待排序记录的关键字,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止。

冒泡排序

基本思路:每趟不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换。

优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换发生,还可以提前结束排序。

前提:顺序存储结构

例:关键字序列 T=(21,25,49,25*,16,08),请写出冒泡排序的具体实现过程。

图示

冒泡排序的算法分析

图示

图示

代码示例

<?php
function bubble_sort($rand_arr)
{
    $arr_count = count($rand_arr);
    for($i=0;$i<$arr_count;$i++){
        //设置flag变量,用来记录数据是否交换完成
        $flag = true;
        for($j=0;$j<$arr_count-1;$j++){
            if($rand_arr[$j] > $rand_arr[$j+1]){
                //进行交换
                $temp = $rand_arr[$j];
                $rand_arr[$j] = $rand_arr[$j+1];
                $rand_arr[$j+1] = $temp;
                $flag = false;
            }
        }
        if($flag){
            break;
        }
    }
    return $rand_arr;
}

$arr = array(21,25,49,25,16,8);
$arr = bubble_sort($arr);
print_r($arr);

详情 【PHP】冒泡排序以及优化

快速排序

基本思想:从待排序列中任取一个元素 (例如取第一个) 作为 中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。

优点:因为每趟可以确定不止一个元素的位置,而且呈指数增加,所以特别快!

前提:顺序存储结构

例如:关键字序列 T=(21,25,49,25*,16,08), 请写出快速排序的算法步骤。(设以首元素为枢轴中心)

图示

算法分析

图示

这种不断划分子表的过程,计算机如何自动实现?

  • 每一趟的子表的形成是采用从两头向中间交替式逼近法;
  • 由于每趟中对各子表的操作都相似,主程序可采用递归算法。

图示
图示

代码示例

<?php
function quick_sort($array) {
    if(count($array) <= 1) return $array;
    $key = $array[0];//选第一个元素为枢轴
    $rightArray = array();
    $leftArray = array();
    for($i = 1; $i < count($array); $i++) {
        if($array[$i] >= $key) {//大的放右边
            $rightArray[] = $array[$i];
        } else {
            $leftArray[] = $array[$i];//小的放左边
        }
    }
    $leftArray = quick_sort($leftArray);//递归调用左边数组
    $rightArray = quick_sort($rightArray);//递归调用排序右边数组
    return array_merge($leftArray, array($key), $rightArray);//合并
}
$arr = array(21,25,49,25,16,8);
$arr = quick_sort($arr);
print_r($arr);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值