以前总是把冒泡排序和选择排序弄混了,今天打算好好总结一下
我觉得还是应该使用图文结合的方式才能更好的理解他们的原理和方便记忆
这里是以升序为例
1、冒泡排序
数组中相邻的元素,两两进行比较,如果前者比后者大的话,就进行交换,下面直接上图片进行理解吧
代码如下:(上图中的数组和代码中的数组是不一致的)
class BubbleSort
{
public static void main(String[] args)
{
//冒泡排序
int[] arr = {14,42,2,56,6};
//外层控制比较的次数
for(int i = 0;i<arr.length;i++){
//内层 遍历数组 每一轮比较之后,都减少一个元素参与 而且每次从0开始进行遍历
/*
每一次遍历都少一个元素参与遍历
所以减少的元素个数由外层循环遍历来控制【建议外层循环遍历从0开始】
*/
for(int j = 0; j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int j:arr){
System.out.print(j+"\t");
}
}
}
至于输出的截图我就不上传了
2、选择排序
第一轮排序时,获取数组中第一个元素与之后的每一个元素进行比较,升序获得最小值
第二轮排序时,获取数组中第二个元素与之后的每一个元素进行比较,获得次小值
然后依次比较......
废话再多,不如画图理解来的快
代码如下:
class SelectSort
{
public static void main(String[] args)
{//选择排序
int[] arr = {12,65,34,65,78,8};
//外层控制比较的次数
for(int i=0;i<arr.length-1;i++){
//内层遍历数组
for(int j = i+1;j<arr.length;j++){
//通过外层控制固定不变的值
if(arr[i] > arr[j]){
//交换位置
//定义一个临时变量 记录一个变量的值
int t = arr[i];
//改变该变量的值
arr[i] = arr[j];
//将临时变量的值赋值给另外一个变量
arr[j] = t;
}
}
}
for(int a: arr){
System.out.print(a+"\t");
}
/*
排序完成之后,修改的是数组本身 没有生成新的数组的对象
*/
}
}
3、插入排序
第一次进行排序时,是从数组中的第二个元素开始,与之前的元素进行两两比较
第二次进行排序时,是从数组中的第三个元素开始,与之前的元素进行两两比较
.....
与选择和冒泡排序不同的是。插入排序是从后往前进行排序比较的,而选择和冒泡是采用从前往后进行排序比较的
代码如下:
class InsertSort
{
public static void main(String[] args)
{
//插入排序
int[] arr = {12,34,23,44,41};
//外层控制比较的轮数 length-1
for(int i = 1;i <= arr.length-1;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;
}
}
}
for(int k:arr){
System.out.print(k+"\t");
}
}
}
以上的代码中的数组元素和图片中的数组的元素并不相同,所以看的友友要十分注意哟!!!