代码
废话少说,先上代码:
System.out.print("排序前:");
for(int i=0;i<N;i++){
a[i] = (int)(Math.random()*1000);
System.out.print(a[i]+" ");
}
System.out.println();
for(int i=0;i<N-1;i++){
int minIndex = i;
for(int j = i;j<N-i-1;j++){
//最大的向后跑
if(a[j]>a[j+1]){
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
//找最小的数和a[i]换
if(a[minIndex] > a[j]){
minIndex = j;
}
}
int temp = a[minIndex];
a[minIndex]=a[i];
a[i]=temp;
}
System.out.print("排序后:");
for(int i=0;i<N;i++){
System.out.print(a[i]+" ");
}
思路
上一篇说了经典冒泡的算法和实现,这里我对冒泡进行了少许的优化,我们知道冒泡是对直接排序的一种优化,他减少了循环的次数,减少了时间复杂度。那我们能不能更进一步的减少循环次数呢?
这里的思路是在冒泡的同时,找出每一次冒泡过程中的最小值,在内循环结束时,将最小值和第一个数交换。
if(a[minIndex] > a[j]){
minIndex = j;
}
}
int temp = a[minIndex];
a[minIndex]=a[i];
a[i]=temp;
这样就简单的完成了一次优化。欢迎大佬纠错和further优化。
对比:
经典冒泡:
for(int i = 0;i<a.length-1;i++){
for(int j=0;j<a.length-i-1;j++){
}
}
优化冒泡:
for(int i=0;i<N-1;i++){
for(int j = i;j<N-i-1;j++){
}
}
去别仅仅发生在内循的int j之上。这就可以看出循环的次数减少了。