18. 请写出选择排序的代码
- 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到
已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
![]()
public class SelectSort {
public int[] sort(int arr[]) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
// 认为目前的数就是最小的, 记录最小数的下标
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
// 修改最小值的下标
minIndex = j;
}
}
// 当退出for就找到这次的最小值,就需要交换位置了
if (i != minIndex) {
//交换当前值和找到的最小值的位置
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}
public static void main(String[] args) {
SelectSort selectSort = new SelectSort();
int[] array = {2,5,1,6,4,9,8,5,3,1,2,0};
int[] sort = selectSort.sort(array);
for (int num:sort){
System.out.print(num+"\t");
}
}
}
19.请写出插入排序的代码
- 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,
- 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
- 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
- 包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。
- 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 ⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 ⒌ 将新元素插入到下一位置中 ⒍重复步骤2~5
- 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的
- 一个变种,称为二分查找排序。
public class InsertSort {
private int[] sort(int[]arr){
//如果传入的数组为空或者只有一个值,就直接返回
if(arr == null || arr.length < 2){
return arr;
}
//不为空则进循环判断
//外层循环控制总数量
for(int i=1;i<arr.length;i++){
//内层循环依次减少并提出结果
for(int j=i;j>0;j--){
//如果当前数字小于前一个,则交换,否则不变
if(arr[j]<arr[j-1]){
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}else{
break;
}
}
}
return arr;
}
public static void main(String[] args) {
InsertSort insertSort = new InsertSort();
int[] array = {2,5,1,6,4,9,8,5,3,1,2,0};
int[] sort = insertSort.sort(array);
for (int num:sort){
System.out.print(num+"\t");
}
}
}
20.可变参数的作用和特点
转载详解
- 总结1:可变参数
1.可变参数的形式 ...
2.可变参数只能是方法的形参
3.可变参数对应的实参可以0,1,2.....n个,也可以是一个数组
4.在可变参数的方法中,将可变参数当做数组来处理
5.可变参数最多有一个,只能是最后一个
6.可变参数好处:方便 简单 减少重载方法的数量
7.如果定义了可变参数的方法,不允许同时定义相同类型数组参数的方法
- 总结2: 数组做形参和可变参数做形参联系和区别
- 联系:
1.实参都可以是数组;
2.方法体中,可变参数本质就是当做数组来处理
- 区别:
1.个数不同 可变参数只能有一个数组参数可以多个
2.位置不同 可变参数只能是最后一个 数组参数位置任意
3.实参不同 可变参数实参可以0,1,2.....个,也可以是一个数组,数组的实参只能是数组
private static int sum(int... values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}