开始从一些小的算法开始,逐渐深入学习算法和数据结构。主要依靠《算法》第四版和《图解数据结构--使用Java》。
今天是一个引子。
public static void main(String[] args) {
//冒泡排序 设定从大到小
int [] arg = new int[]{15,9,55,52,45,98,107};
for (int i = 0; i < arg.length-1; i++) {
for(int j = 0; j<arg.length-i-1; j++){
if (arg[j] < arg[j+1]){
int temp = arg[j];
arg[j] = arg[j+1];
arg[j+1] = temp;
}
}
}
System.out.println("==========冒泡排序后的值为=========");
for (int i = 0; i < arg.length; i++) {
System.out.println(arg[i]);
}
}
明白冒泡排序的思想,实现不是很难。外层循环使用length-1是因为最后的一个不用冒泡,里面的循环控制用length-i-1是因为要减去外层已经排过序的部分。循环体的操作是将两个位置的值对调。
最后结果如下:
这个冒牌排序是一个最简单的写法,可以在这个基础上适当优化。
int [] arg = new int[]{15,9,55,52,45,98,107};
boolean flag = true;//设置一个判断条件
for (int i = 0; i < arg.length-1; i++) {
for(int j = 0; j<arg.length-i-1; j++){
if (arg[j] > arg[j+1]){
int temp = arg[j];
arg[j] = arg[j+1];
arg[j+1] = temp;
flag = false; //发生更改时表明经过排序
}
}
if(flag){ //如果满足条件,则表明在这一次的循环中,没有进行过元素的变动,所有的元素都是满足要求的排序,无需进入下次循环
break; //每次循环实际上在越来越小的范围内进行比较
}
}
System.out.println("==========冒泡排序后的值为=========");
for (int i = 0; i < arg.length; i++) {
System.out.println(arg[i]);
}
在此基础上,还可以对排序边界进行优化。
int [] arg = new int[]{15,9,55,52,45,98,107};
boolean flag = true;
int lastExchangeIndex = 0;
int sortBorder = arg.length - 1 ;
for (int i = 0; i < arg.length-1; i++) {
for(int j = 0; j < sortBorder; j++){
if (arg[j] > arg[j+1]){
int temp = arg[j];
arg[j] = arg[j+1];
arg[j+1] = temp;
flag = false;
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex;
if(flag){
break;
}
}
System.out.println("==========冒泡排序后的值为=========");
for (int i = 0; i < arg.length; i++) {
System.out.println(arg[i]);
}