在java数据结构和算法中,简单排序分为冒泡排序、选择排序、插入排序三种,也是最基础的三种,
废话不多,码上见!
1、冒泡排序
public class BubbleSort{
public static void sort(int[] arr){
//临时变量,用于数据交换,如果不用临时变量的话用运算符或者增加操作步骤也能实现;
int temp = 0;
//一个for循环用于遍历一次数组中的数据
for (int i = 0; i < arr.length -1; i++) {
//第二个for循环为了让每一个数组中的数据都去对比一次数组中的数据,初学的时候不知道为什么就是不会!!!太笨了~(* ̄ω ̄)~
for (int j = arr.length -1; j > i; j--) {
if (arr[j] < arr[i]) {//正在往上冒的数据如果遇到小于它的数据就交换位置
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
//打印排序后的数据
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = {23,43,5,71};//声明一个int类型数组,用于排序
sort(arr);//执行排序方法
}
}
输出结果:
5
23
43
71
重点:
- 数据从底部开始往上排
- 遇到比自身大的数继续排,直到遇到小于等于自身的数为止
2、插入排序
//这次没有另外写方法了,直接放main里
public static void main(String[] args) {
int[] arr = {19,65,1,8,33,45,21,6};//声明一个int类型数组,用于排序
int temp = 0;//临时变量用于交换数据
int k = 0;//起到游标的作用,记录需要插入的位置
for (int i = 1; i < arr.length; i++) {
k = i;
temp = arr[i];//记录正在排序的那个数
while(k > 0 && temp <= arr[k-1]){//判断从后往前正在排序的那一个是否已经到头了,以及判断前一个数是否比自身大
arr[k] = arr[k-1];//把比temp大的数往后移
k--;//记录当前数据往后移之后,“空出来的”,需要插入的位置
}
arr[k] = temp;//最后把数据放到需要的插入的位置
}
//打印排序后的结果
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
输出结果
1
6
8
19
21
33
45
65
重点:
- 插入排序是从第二个数开始排的,用第二个数开始,然后和前面的数进行比较,并不是和冒泡一样比较所有的数。
- 插叙排序的效率比冒泡要高,因为不用每个数据都和数组中的数据对比一遍
- 其实和冒泡差不多,只是冒泡是每比较一次数据就交换一次,这里插入排序一轮比较之后交换的次数是1,其他的都是把前面的数移动到了后面,没有数据交换。
3、选择排序
public static void sort(int[] arr){
int k;//起到游标的作用,记录要交换的位置
int temp;//临时变量用于交换数据
for (int i = 0; i < arr.length; i++) {
k = i;//记录开始的时候要排序的数所在的位置
for (int j = i; j < arr.length; j++) {//从当前位置(arr[k])往后比较
if (arr[j]<arr[k]) {//在比较数据的时候如果遇到后面的数比自身小,就记录后面的数的位置
k = j;
}
}
temp = arr[i];//在最后执行数据交换
arr[i] = arr[k];
arr[k] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = {9,15,4,2,99};//声明一个int类型数组,用于排序
sort(arr);
}
输出结果
2
4
9
15
99
重点:
- 和插入排序一样需要有游标
- 排序中比较完数据之后不作数据交换的操作,而是记录要交换的位置
- 效率在这三个中最高,因为全程执行的数据交换操作最少