排序算法(一)
java中的关于排序的算法其实直接就可以调用就好了,但是有时候面试的时候还是会用到,所以还是学习一下的比较好~故此记笔记于下:
冒泡排序
冒泡就是相邻的两个数进行比较,然后将小的数放到前面,大的数放到后面,等第一轮比下来的时候最大的数就到最后面下一次比较就可以不用管它了。就好像水里面的气泡一般,大的气泡总是先冒出来…很难理解?直接看下面的例子。
冒泡排序:
arr[ 9, 8 ,10 , 7 , 6 , 0 , 11 ]
参与排序数据: 9 8 10 7 6 0 11
第一次循环:
第1次比较:8 9 10 7 6 0 11 (因为9>8,交换,其他位置不变)
第2次比较:8 9 10 7 6 0 11 (因为9<10,不交换,其他位置不变)
第3次比较:8 9 7 10 6 0 11 (因为10>7,交换,其他位置不变)
第4次比较:8 9 7 6 10 0 11 (因为10>6,交换,其他位置不变)
第5次比较:8 9 7 6 0 10 11 (因为10>0,交换,其他位置不变)
第6次比较:8 9 7 6 0 10 11 (因为10<11,不交换,其他位置不变)
最后冒出最大的数:11 放在最后
第二次循环:
参与比较的数据:8 9 7 6 0 10 (因为最大的数已经出来了就不用管了)
第1次比较:8 9 7 6 0 10 (因为8<9,不交换,其他位置不变)
第2次比较:8 7 9 6 0 10 (因为9>7,交换,其他位置不变)
第3次比较:8 7 6 9 0 10 (因为9>6,交换,其他位置不变)
第4次比较:8 7 6 0 9 10 (因为9>0,交换,其他位置不变)
第5次比较:8 7 6 0 9 10 (因为9<10,不交换,其他位置不变)
最后冒出最大的数:10 放在最后
第三次循环:
参与比较的数据:8 7 6 0 9
第1次比较:7 8 6 0 9 (因为8>7,交换,其他位置不变)
第2次比较:7 6 8 0 9 (因为8>6,交换,其他位置不变)
第3次比较:7 6 0 8 9 (因为8>0,交换,其他位置不变)
第4次比较:7 6 0 8 9 (因为8<9,不交换,其他位置不变)
最后冒出来最大的数:9 放在最后
第四次循环:
参与比较的数据:7 6 0 8
第1次比较:6 7 0 8 (因为7>6,交换,其他位置不变)
第2次比较:6 0 7 8 (因为7>0,交换,其他位置不变)
第3次比较:6 0 7 8 (因为7<8,不交换,其他位置不变)
最后冒出来最大的数:8 放在最后
第五次循环:
参与比较的数据:6 0 7
第1次比较:0 6 7 (因为6>0,交换,其他位置不变)
第2次比较:0 6 7 (因为6<7,不交换,其他位置不变)
最后冒出来最大的数:7 放在最后
第六次循环:
参与比较的数据:0 6
第1次比较:0 6 (因为0<6,不交换,其他位置不变)
最后比较出来的结果为:0 6 7 8 9 10 11
观察循环了6次,然后第一次比较6次一次递减,找出此规律…
下面进行代码的演示:
public class MaoPao
{
public static void main(String[] args){
int[] arr = { 9, 8 ,10 , 7 , 6 , 0 , 11};
for(int i = arr.length - 1 ; i > 0 ; i-- ){//这里要留出来一个位置,因为是前后比较,所以比较到最后一个时候会出现数组下标越界
for(int j = 0 ; j < i ; j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];//定义一个中间变量来暂时存储a[j]的值
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i : arr){
System.out.print(i+" ");
}
}
}
运行结果:
选择排序
思想:每一次从参与比较的元素中找出一个最小值,拿着这个最小值和最前面的数交换位置。选择排序的好处每一次交换位置都比冒泡排序有意义。
选择排序:
int[] arr = {3 , 1 , 6 , 2 , 5 };
参与比较的数:3 1 6 2 5
最小数:1 和最前面的数交换位置
第一次循环以后:1 3 6 2 5
参与比较的数据:3 6 2 5
最小数:2 和最前面的数交换位置
第二次循环以后:2 6 3 5
参与比较的数据:6 3 5
最小数:3 和最前面的数交换位置
第三次循环以后:3 6 5
参与比较的数:6 5
最小数:5 和最前面的数交换位置
第四次循环以后:5 6
注意:5条数据,循环4次。
具体实现:
public class SelectSort
{
public static void main(String[] args){
int[] arr = {3 , 1 , 6 , 2 , 5 };
for(int i = 0 ; i < arr.length-1 ; i++){
int min = i;//比较一次以后最小数就放在最前面了,就不用管了,后面的那个数充当第一个数
for(int j = i+1 ; j < arr.length ; j++){
if(arr[j] < arr[min]){
min = j ;//记录下最小值得位置
}
}
//如果他们min和i相等,说明最小的值不是i为下标的这个数
if(min!=i){
int temp = arr[i];//把最小的数换到最前面
arr[i] = arr[min];
arr[min] = temp;
}
}
for(int i : arr){
System.out.print(i+" " );
}
}
}
运行结果:
有错误欢迎指出~