- 基于对java数据结构的理解,将java数据结构排序做一个小的汇总,分上下两版完成.
- 本次汇总中提供代码讲解,代码中不清楚地方都已通过注解完成
- 代码是通过运行验证可行的(大家可以通过实际操作理解)
- 文章末尾我会将代码上传云端,感兴趣的朋友可以下载执行运行
一、选择排序
1.1简单选择排序
1.1.1 定义
选择排序:通俗理解就是将一组待排序的数组,
反复取出待排序中最小值,「所以在程序嵌套二次循环中j的初始值为j=i+1,j长度为数组长度,每次j++」
,依次进行排序的过程(比如一组数组[2,4,3,1],第一次将最小值1取出放到起始位置,第二次将剩下最小的取出放到1后面,依次类推,直到取完)
1.1.2 简单选择排序功能方法
/**
* 选择排序:即扫描全部数组,找出最小的置换到第一位,在此扫描剩下的,找出最小置换到第二位...依次类推直到置换完成为止
* @param arr
*/
public void selectorSort(int arr[]){
for (int i = 0; i < arr.length; i++) {
System.out.println("当前数组下标:"+i);
int minIndex = i; //第一次循环置换的时候将数组中第一个值作为最小值
//注意:j初始值为i+1,循环嵌套目的是
// -1.为了将默认当前的最小值和数组中其他值依次比较,直到找出最小的值的下标
// -2.找出最小的值并没有结束,而是接着和数组中其他值比较,直到确认当前下标值为最小值
// -3.否则最小下标值被剩下数组的最小下标值置换
for (int j = i+1 ; j < arr.length; j++) {
System.out.println("arr["+minIndex+"]:"+arr[minIndex]);
System.out.println("arr["+j+"]:"+arr[j]);
if (arr[minIndex]>arr[j]){
minIndex = j; //目的就是找出数组中最小的下标值
System.out.println("循环扫描中当前最小下标minIndex:"+minIndex);
}
}
System.out.println("实际最小下标minIndex:"+minIndex+",第【"+(i+1)+"】次扫描当前最小值为:"+arr[minIndex]);
if (minIndex != i){
int t;
t = arr[i];
arr[i] = arr[minIndex]; //第一次扫描将最小值置换到第一个位置,以后依次类推
arr[minIndex] = t; //将初始化到数组值置换到原来最小值位置,以后依次类推
}
System.out.println("输出第【"+(i+1)+"】次置换结果:"+Arrays.toString(arr));
System.out.println("------------------------------------------------");
}
System.out.println("输出最终结果:"+Arrays.toString(arr));
}
}
1.1.3 举例调用过程
public class sortTest {
public static void main(String[] args) {
SortMethodUtils sortMethodUtils = new SortMethodUtils();
int arr[] ={3,9,6,1,2};
System.out.println("----选择排序-----");
sortMethodUtils.selectorSort(arr);
}
}
选择排序流程图:
1.1.4 运行结果
----选择排序-----
当前数组下标:0
arr[0]:3
arr[1]:9
arr[0]:3
arr[2]:6
arr[0]:3
arr[3]:1
循环扫描中当前最小下标minIndex:3
arr[3]:1
arr[4]:2
实际最小下标minIndex:3,第【1】次扫描当前最小值为:1
输出第【1】次置换结果:[1, 9, 6, 3, 2]
------------------------------------------------
当前数组下标:1
arr[1]:9
arr[2]:6
循环扫描中当前最小下标minIndex:2
arr[2]:6
arr[3]:3
循环扫描中当前最小下标minIndex:3
arr[3]:3
arr[4]:2
循环扫描中当前最小下标minIndex:4
实际最小下标minIndex:4,第【2】次扫描当前最小值为:2
输出第【2】次置换结果:[1, 2, 6, 3, 9]
------------------------------------------------
当前数组下标:2
arr[2]:6
arr[3]:3
循环扫描中当前最小下标minIndex:3
arr[3]:3
arr[4]:9
实际最小下标minIndex:3,第【3】次扫描当前最小值为:3
输出第【3】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
当前数组下标:3
arr[3]:6
arr[4]:9
实际最小下标minIndex:3,第【4】次扫描当前最小值为:6
输出第【4】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
当前数组下标:4
实际最小下标minIndex:4,第【5】次扫描当前最小值为:9
输出第【5】次置换结果:[1, 2, 3, 6, 9]
------------------------------------------------
输出最终结果:[1, 2, 3, 6, 9]
Process finished with exit code 0
二 插入排序
2.1 直接插入排序
2.1.1 定义
插入排序: 通俗理解就是相当于我们玩牌,起好牌之后,我们会按照从大到小或从小到大的顺序重新排序
[实际定义] 指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序
3.基于其定义,代码思路:在嵌套方法中第二次循环中,j初始化值为i(根据定义,i前面的是排序好的,需要将i和i-1之前的值进行比较),由于每次比较j都需要减1,因此j必须为大于0的值,所以j>0,j–;
2.1.2 插入排序功能方法
public void insertSort(int arr[]){
for (int i = 1; i <arr.length; i++) { //从第二个开始和其前面到比较,比前面到小到插入到前面
for (int j = i; j >0 ; j--) {
//arr[j]当前值也就是要和j之前的数值比较插入其前面的值,arr[j-1]前一个值
if (arr[j] < arr[j-1]){ //如果比前一个小
int temp = arr[j-1]; //1.先将前一个值给到第三个参数
arr[j-1] = arr[j]; //2.将当前值给到前一个值
arr[j] = temp; //把1中最初的前一个值给到当前值,完成交换
}else{
break;
}
}
System.out.println("第【"+i+"】次插入排序结果:"+Arrays.toString(arr));
}
System.out.println("最终排序结果:"+Arrays.toString(arr));
}
2.1.3 举例调用过程
public class sortTest {
public static void main(String[] args) {
SortMethodUtils sortMethodUtils = new SortMethodUtils();
int arr[] ={3,9,6,1,2};
System.out.println("----插入排序-----");
sortMethodUtils.insertSort(arr);
}
}
插入排序的流程图分析:
2.1.4 运行结果
运行结果:
----插入排序-----
第【1】次插入排序结果:[3, 9, 6, 1, 2]
第【2】次插入排序结果:[3, 6, 9, 1, 2]
第【3】次插入排序结果:[1, 3, 6, 9, 2]
第【4】次插入排序结果:[1, 2, 3, 6, 9]
最终排序结果:[1, 2, 3, 6, 9]
Process finished with exit code 0