程序逻辑与算法2_聂浩

嘘嘘喵 社区会员 2021-09-27 22:32:45

9.27

工作内容

任务4.1.3 对数组[8, 2, 11, 9, 1, 5, 3]使用二分算法进行排序

package com.xxm.task4;

import java.util.Arrays;

//用递归的方法实现二分合并排序

/*思路,两个函数,
第一个:归并排序函数mergeSort,在mergeSort函数中引用merge。
第二个:有序合并函数merge。作用是有序地合并两个有序序列。
 */


public class quest2_3_BinaryMergeSort {
    //第一步,先写出有序合并函数merge

    public static void merge(int arr[], int low, int mid, int high) {
        /*
        变量解释:
        low是待合并的第一个数组的起点(在数组arr中的索引);
        mid-1是第一个数组的终点,因此mid是第二个数组的起点
        high是第二个数组的终点。
        因此第一个数组的长度为(mid - low)
        第二个数组的长度为(high - mid + 1 )
         */
        int i = 0;//定义计数器
        int[] lowArr = new int[mid - low];
        int[] highArr = new int[high - mid + 1];   //定义两数组的长度。
        for (i = low; i < mid; i++) {      //这两个for循环用来定义左右数组
            lowArr[i - low] = arr[i];  // lowArr的第一个变量即arr[low]
        }
        for (i = mid; i <= high; i++) {
            highArr[i - mid] = arr[i];
        }
        //接下来是完成两数组的排序合并
        i = 0;    //计数器置零,作为左数组计数器
        int j = 0;   //作为右数组的计数器
        int k = low;    //传入数组的位置计数器
        while (i < mid - low && j < high - mid + 1) {    //当左右两数列的计数器仍在其长度范围内时才执行,否则退出循环
            if (lowArr[i] < highArr[j]) {
                arr[k++] = lowArr[i++];
            } else {
                arr[k++] = highArr[j++]; //赋值完后自增
            }
        }
        //上面循环结束后,还有数据未处理,将其直接放在后面
        while (i < mid - low) {
            arr[k++] = lowArr[i++];
        }
        while (j < high - mid + 1) {
            arr[k++] = highArr[j++];
        }
    }

    //第二步:写递归二分归并函数

    public static void mergeSort(int arr[], int low, int high) {
        if (low < high) {    //low=high时,代表达到了递归最底层,执行合并
            int mid = (low + high) / 2; //定义mid,将传入数组分成两部分
            mergeSort(arr, low, mid);   //迭代,处理左边的数组
            mergeSort(arr, mid + 1, high);  //迭代,处理右边的数组
            merge(arr, low, mid+1, high);    //最底层,调用merge函数完成排序。
        }
    }

    //第三步:主程序,调用mergeSort函数,并输出数组
    public static void main(String[] args) {
        int arr[] = new int[]{8, 2, 11, 9, 1, 5, 3};
        mergeSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

}

这是今天的主要工作内容

C1任务24-1

使 div.box2 定位在 div.box1 上方,横线处可填写的最大整型数字是

答:z-index表示z轴,很好理解。而z-index值相同时,后面代码的内容会覆盖前面的,所以最多填9。

C1任务24-2

使类名为 top 的 div 定位在类名为 bottom 的 div 上方,横线处可填写的最小整数是?

答:同理,10 

C1任务24-3

现要求“Hello,World!”文本相对于 div 向左偏移 20px,显示效果如下图,请补全代码片段

答:left用于非static元素,意为规定元素左边框与其父元素(本题中是灰色框框)左边框之间的偏移量,左为负右为正。因此应该填-20。

C1任务25

现要求将 main 中的 section 元素在一行排列,请补全代码片段。

答:浮动即可,应填float。

 

知识学习

算法可视化学习

冒泡排序

原理:遍历数组,比较两个相邻数据,如果其大小位置不对则交换其位置,并且继续遍历,遍历完一轮数组之后则完成一次冒泡。重复若干次之后冒泡排序就完成了。

以数组 int []arr= new int[ ]{3,38,5,47,15,36,27,2,4,19} 为例。

要用到的变量、计数器

i:交换循环的计数器

len:未排序数组的长度计数器初始值为arr.length,每完成一轮冒泡,len--

第一个循环:从第i个数开始(i=0,第0个数据是3

比较第i个数和第i+1个数,

  1. 如果arr[i] > arr[i+1],则交换两数位置,然后i++。
  2. 如果arr[i] <= arr[i+1],不做操作,然后i++。

重复这个循环,直到i>= len -1。说明这一轮冒泡完成,然后len--。

开始进入第二个循环。并不断重复,直到len=0,说明冒泡排序完成。

插入排序

已排序数组长度计数器:len

原理:

第一步:将第一个数标记为已排序。len=1

第二步:选取第i个数(初始i=1),将其与已排序数列的倒数第 j+1 (初始 j =0)个数比较,如果

arr[ i ] < arr[ len - j ],则将第 j 个数往后移动一格,然后j++,再重复第二步。直到arr[ i ] > arr[ j ]。

第三步:第二步后,如果arr[ i ] > arr[ len - j ],此时直接将arr[ i ] 插入在arr[ len - j ]的位置,然后i++。

 

然后一直循环第二、第三步。直到 i = length.arr,排序完成。

 

快速排序

原理:

1.选取一个数作为轴心点(一般选未排序序列的左边第一个数)

2.遍历比较,把大于轴心点数字的数放在轴心点左边,把大于轴心点的数放在轴心点右边。

3.对左右子序列重复前两步,直到所有子序列长度都为1。

 

归并排序

原理:

1、将序列中数字分成若干组,每个数字为一组。

2、将组两两合并,保证合并后的组是有序的。(比较两组的头部,把小的取出来放第一个,以此类推)

3、重复1、2,直至只剩下一组。

知识点

toString方法

作用:将对象转为字符串。

 

明日计划

1、把递归版本的和数分解搞定(今天最后都没搞完)。

2、学习回调,用回调完成规定的3个任务。

3、通过算法可视化工具,熟悉堆排序以及各种查找。

...全文
176 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
训练、训练、训练!
其他 其他
社区管理员
  • 实训001
  • 非鱼up
  • andy421
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

自律训练,自信挑战!

试试用AI创作助手写篇文章吧