需求:
数组元素:{24, 69, 80, 57, 13}
请对数组元素进行排序。
排序后的结果应为:{13,24,57,69,80}
使用冒泡排序法&&选择排序法排序
冒泡排序分析:
冒泡排序:
相邻元素两两比较,大的往后放第一次完毕,最大值出现在了最大索引处;
**本质:** 通过比较做排序
1.比较的次数 双重for 循环 (外循环决定比较多少轮,内循环决定每轮比
较多少次)
2.谁 和谁比较 相邻的两个元素 for(变量 外循环 I 内循环 j )
arr[i] arr[j]
3.如何比较 前> 后 交换 arr[j] > arr[j + 1]
文字太多不想看? 没关系 接下来上图解;
这个图里面的值已经交换过来了 只要看排序交换的规律就好了
第一轮 0-1 1-2 2-3 3-4;红色曲线
第二轮 0-1 1-2 2-3;蓝色曲线
第三轮 0-1 1-2;黄色曲线
第四轮 0-1;绿色曲线
轮数
数组中一共五个参数交换四轮
如果是八个参数就交换七轮
由此得出一个规律 交换多少轮是由数组中有几个参数来定的
轮数为:数组名.length - 1;
每轮交换次数
第一轮比较四次;
第二轮比较三次;
第三轮比较两次;
第四轮比较一次;
交换次数是依次递减的;
为什么?
因为第一轮比较过后最大数一定在最大索引参数上
所以第二轮比较就可以不再比较索引4的参数的
由此
好,搞明白比较的轮数和每轮比较的次数 接下来就要上代码了
public static void main(String[] args) {
//定义数组
int[] arr = {24, 69, 80, 57, 13};
BubblingArray(arr);冒泡排序
}
public static void BubblingArray(int[] arr) {
int a = 0;
//引入第三方变量
for(int i = 0; i < arr.length - 1; i++){//外循环决定比较多少轮
for(int j = 0; j < arr.length - 1 - i; j++){//内循环决定每轮比多少次 arr.length - 1为了防止索引越界
if(arr[j] > arr[j + 1]){
a = arr[j];
//前面的数组参数赋值给第三方变量
arr[j] = arr[j + 1];
//后面的数组参数赋值给前面的数组参数
//例:arr[1] = arr[2];
arr[j + 1] = a;
//第三饭变量再赋值给后面的数组参数;
}
}
}
}
外循环没什么好说的就是设置比较多少轮;
内循环是设置每轮比较多少次
j < arr.length - 1 - i;
这行代码运行出来就是递减的
代码包装成了方法;
if语句是用来判断前面的参数是否比后面的参数大 大的话就交换
一开始也分析了 冒泡排序就是前面参数与后面参数交换的
if语句里面就是经典的引入第三方变量反转
选择排序分析:
选择排序:
原理:从0索引开始,依次与后面的元素作比较,小的在前,大的在后。
**本质:** 通过比较做排序
1.比较的次数 双重for 循环 (外循环决定比较多少轮,内循环决定每轮比
较多少次)
2.谁 和谁比较 相邻的两个元素 for(变量 外循环 I 内循环 j )
arr[i] arr[j]
3.如何比较 arr[0] > arr[1 - max]
每轮首元素依次与后面的元素比较
OK 上图
拿数组{13,24,57,69,80}作比较
交换次数:
****
***
**
*
public static void main(String[] args) {
//定义数组
int[] arr = {24, 69, 80, 57, 13};
select(arr);//选择排序
fang1(arr);//遍历
}
public static void select(int[] arr) {
int a = 0;
//第三方变量,作用反转
for(int i = 0; i < arr.length - 1; i++ ){
//外循环决定比较多少轮
for (int j = i + 1; j < arr.length; j++){//内循环决定每轮比多少次 arr.length - 1为了防止索引越界
if(arr[i] > arr[j]){
//索引 i 与其他索引比较;
a = arr[i];
//索引0赋值给第三方变量
arr[i] = arr[j];
arr[j] = a;
}
}
}
}
好的,这就是冒泡与选择排序