110
社区成员




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));
}
}
这是今天的主要工作内容
使 div.box2 定位在 div.box1 上方,横线处可填写的最大整型数字是
答:z-index表示z轴,很好理解。而z-index值相同时,后面代码的内容会覆盖前面的,所以最多填9。
使类名为 top 的 div 定位在类名为 bottom 的 div 上方,横线处可填写的最小整数是?
答:同理,10
现要求“Hello,World!”文本相对于 div 向左偏移 20px,显示效果如下图,请补全代码片段
答:left用于非static元素,意为规定元素左边框与其父元素(本题中是灰色框框)左边框之间的偏移量,左为负右为正。因此应该填-20。
现要求将 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个数,
重复这个循环,直到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,直至只剩下一组。
作用:将对象转为字符串。
1、把递归版本的和数分解搞定(今天最后都没搞完)。
2、学习回调,用回调完成规定的3个任务。
3、通过算法可视化工具,熟悉堆排序以及各种查找。