在开始学习排序前我们需要明白如下几个知识点:
1.时间复杂度:一个算法执行所需要的时间;
2.空间复杂度:运行完一个算法的过程需要的内存大小;
3.稳定性:稳定的排序,如果待排序的序列中,之前有a,b两个元素并且a=b,在经过了排序算法后,a元素的位置依然在b元素的前方这种排序算法是稳定的;反之这种排序就不稳定;
4.内排序:所有的排序算法都在内存中完成;
5.外排序:待排序的数据非常巨大,因此需要将数据放在磁盘中,在排序过程中需要需要通过磁盘和内存数据的交换才能进行
冒泡排序
冒泡排序属于稳定排序,算法的最佳时间复杂度为O(n),最差的数据复杂度为O(n2),所以时间复杂度为O(n2);同时它属于交换排序,具体思路为:第一次比较从第一个元素起,依次比较相邻的两个元素,如比较第一个元素和第二个元素,如果第一个元素大于第二个元素则交换,依次重复上述操作,在进行完第一轮两两比较后最大的元素在最后一个位置,再进行上述操作,次大的元素在数组的倒数第二个位置;
实现代码如下:
/**
* 冒泡排序
*/
public class BubblingSort {
public void applyOptimize(int[] value) {
if (value ==null || value.length ==0) {
System.out.println("value is null ---------->");
return;
}
int indexOne, indexTwo, tempValue;
for (indexOne = value.length -1; indexOne >0; indexOne--) {
for (indexTwo =0; indexTwo < indexOne; indexTwo++) {
if (value[indexTwo] > value[indexTwo+1]) {
tempValue = value[indexTwo];
value[indexTwo] = value[indexTwo+1];
value[indexTwo+1] = tempValue;
}
}
}
}
}
可以从几个方面优化冒泡排序算法
1.设置一个标记变量,如果在某一轮两两比较过程中,没有发生元素交换说明数组已经排好序了,算法运算结束;
public void applyOptimize(int[] value) {
if (value ==null || value.length ==0) {
System.out.println("value is null ---------->");
return;
}
boolean isChange =false;
int indexOne, indexTwo, tempValue;
for (indexOne = value.length -1; indexOne >0; indexOne--) {
isChange =false;
for (indexTwo =0; indexTwo < indexOne; indexTwo++) {
if (value[indexTwo] > value[indexTwo+1]) {
tempValue = value[indexTwo];
value[indexTwo] = value[indexTwo+1];
value[indexTwo+1] = tempValue;
isChange =true;
}
}
if(!isChange){
return;
}
}
}
网友评论