学习指引
- 序、专栏前言
- 一、选择排序
- 二、【例题1】
- 1.题目描述
- 2、解题思路
- 3、模板代码
- 三、推荐专栏
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、选择排序
选择排序也是一个非常简单的排序,并且简单且直观。它也类似上篇文章中所讲的插入排序中有有序区和无序区的概念。最开始它所有的数都处于无序区,有序区为空。然后遍历无序区内的元素,找到最大(小)值,将其放入有序区两端,具体放入头还是尾视你找的是最大还是最小值而定。以此类推,直到所有元素排序完毕。
从算法思路来说,使数组完全有序,我们需要进行
n
−
1
n -1
n−1趟选择排序,每次排序需要遍历所有无序区元素得到极值,所以复杂度是稳定的
O
(
n
2
)
O(n^2)
O(n2),不会因为数据有所变化,所以我们只有数据小的时候才可能考虑使用选择排序,且选择排序是不稳定的排序。
其思想其实与冒泡排序特别类型,不过是基于冒泡进行改进,冒泡排序中每次相邻元素比较进行换位,如果满足
a
i
>
a
i
+
1
a_i>a_{i+1}
ai>ai+1就换位,最坏情况下每次比较都有可能进行交换。而选择排序采用延迟交换的方法,每次最多只会交换一次,所以效率提高了。
排序动图:
代码:
二、【例题1】
1.题目描述
输入一个正数 n n n, 然后输出 n n n 个整数,请使用插入排序将他们排序后输出
2、解题思路
直接调用选择排序函数进行排序后输出。
3、模板代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
sort(a);
for (int i = 0; i < n; i++) {
System.out.println(a[i]);
}
}
public static void sort(int[] a) {
//最远可以到达a.length-2的位置
for (int i = 0; i < a.length - 1; i++) {
//定义一个变量,记录最小位置的索引,默认为参与选择的第一个元素
int min = i;
//从i+1开始
for (int j = i + 1; j < a.length; j++) {
if (a[min] > a[j]) {
min = j;
}
}
int b = a[i];
a[i] = a[min];
a[min] = b;
}
}
}