24. 排序

排序:
这里写图片描述
这里写图片描述

冒泡排序:
这里写图片描述
这里写图片描述

$arr = array(0,5,-1,90,-100,34.5,697,-39);
    //这是一个中间变量
    $temp = 0;

    //外层循环
    for($i=0;$i<count($arr)-1;$i++)
    {
        for($j=0;$j<count($arr)-1-$i;$j++)
        {
            //说明前面的数比后面的数大,就要交换
            if($arr[$j]>$arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$temp;
            }
        }
    }
    var_dump($arr);

选择排序:
这里写图片描述
这里写图片描述
这里写图片描述

function selectSort(&$arr)
    {
        $temp = 0;
        for($i=0;$i<count($arr)-1;$i++){
            //假设 $i 就是最小的数
            $minVal = $arr[$i];
            //记录我认为的最小数的下标
            $minIndex = $i;
            for($j=$i+1;$j<count($arr);$j++){
                //说明我们认为的最小值,不是最小
                if($minVal>$arr[$j]){
                    $minVal = $arr[$j];
                    $minIndex = $j;
                }
            }
            //最后交换
            $temp = $arr[$i];
            $arr[$i] = $arr[$minIndex];
            $arr[$minIndex] = $temp;
        }
    }
    $arr = array(0,5,-1,32,15,20,-9);
    selectSort($arr);
    var_dump($arr);

插入排序:
这里写图片描述
这里写图片描述
这里写图片描述

//插入排序法(小到大)
    function insertSort(&$arr)
    {
        //先默认下标为0的这个数已经是有序的
        for($i=1;$i<count($arr);$i++){
            $insertVal = $arr[$i];
            $insertIndex = $i - 1;
            //如果这个条件满足,说明我们还没找到合适的位置
            while($insertIndex>=0 && $insertVal<$arr[$insertIndex]){
                //同时把数后移
                $arr[$insertIndex+1] = $arr[$insertIndex];
                $insertIndex--;
            }
            //插入(这是就给$insertVal找到合适位置)
            $arr[$insertIndex+1] = $insertVal;
        }
    }
    $arr = array(0,5,-1,32,15,20,-9);
    insertSort($arr);
    var_dump($arr);

效率:
    冒泡<选择<插入
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道了。这是一个排序综合问题,需要采用三种或以上的排序方法对随机产生的N个整数进行排序,并统计每种排序方法的性能,找出其中较快的两种方法。 首先,我会生成N个随机整数,大于等于20000。然后,我会依次采用插入排序、快速排序和归并排序三种方法进行排序,并将排序后的结果保存在不同的文件中。下面是具体的实现过程: ```python import random import time N = 10000 # 需要排序的元素个数 MAX_NUM = 50000 # 随机数的最大值 # 生成N个随机整数 data = [random.randint(20000, MAX_NUM) for _ in range(N)] # 插入排序 start_time = time.time() for i in range(1, N): tmp = data[i] j = i - 1 while j >= 0 and data[j] > tmp: data[j + 1] = data[j] j -= 1 data[j + 1] = tmp end_time = time.time() print("插入排序耗时:", end_time - start_time) # 将排序结果保存到文件中 with open("insertion_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") # 快速排序 def quick_sort(data, left, right): if left >= right: return pivot_idx = partition(data, left, right) quick_sort(data, left, pivot_idx - 1) quick_sort(data, pivot_idx + 1, right) def partition(data, left, right): pivot = data[left] while left < right: while left < right and data[right] >= pivot: right -= 1 data[left] = data[right] while left < right and data[left] < pivot: left += 1 data[right] = data[left] data[left] = pivot return left start_time = time.time() quick_sort(data, 0, N - 1) end_time = time.time() print("快速排序耗时:", end_time - start_time) # 将排序结果保存到文件中 with open("quick_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") # 归并排序 def merge_sort(data): if len(data) <= 1: return data mid = len(data) // 2 left = merge_sort(data[:mid]) right = merge_sort(data[mid:]) return merge(left, right) def merge(left, right): i, j = 0, 0 res = [] while i < len(left) and j < len(right): if left[i] < right[j]: res.append(left[i]) i += 1 else: res.append(right[j]) j += 1 res += left[i:] res += right[j:] return res start_time = time.time() data = merge_sort(data) end_time = time.time() print("归并排序耗时:", end_time - start_time) # 将排序结果保存到文件中 with open("merge_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") ``` 上述代码中,插入排序、快速排序和归并排序都被实现了。其中,插入排序通过依次将未排序的元素插入到已排序的序列中,从而实现排序;快速排序使用递归的方式,将待排序序列分成两个子序列,然后对子序列进行排序;归并排序也是使用递归的方式,将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个已排序的子序列合并。 在排序完成后,我会将排序结果保存在不同的文件中。最后,我会统计每种排序方法的耗时,并找出其中较快的两种方法。可以使用time模块中的time.time()方法来计算程序运行的时间。 如果需要使用四种或以上的排序方法,则可以适当增加代码实现即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值