冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。冒泡排序算法的基本流程是:每一轮从头开始两两比较,将较大的项放在较小项的右边,这样每轮下来保证该轮最大的数在最右边
public void bubbleSort(int[] source)
{
for(int i = source.length - 1; i > 0; i--) {
for(int j = 0; j < i; j++) {
if(a[j] > a[j+1])
swap(source, j, j+1);
}
}
}
---------------------
冒泡排序算法还有个可以改进的地方,就是在算法中加入一个布尔变量标识该轮有没有进行数据的交换,若在某一次排序中未发现气泡位置的交换,则说明待排序的无序区中所有的项均已满足排序后的结果
public void bubbleSort(int[] source) {
boolean exchange;
for(int i = source.length - 1; i > 0; i--) {
exchange = false;
for(int j = 0; j < i; j++) {
if(a[j] > a[j+1]) {
swap(source, j, j+1);
exchange = true;
}
}
if(!exchange) return;
}
}
---------------------
算法分析:冒泡排序最好的情况是初始状态是正序的,一次扫描即可完成排序,所以最好的时间复杂度为O(N);最坏的情况是反序的,此时最坏的时间复杂度为O(N2)。平均情况,每轮N/2次循环,N轮时间复杂度为O(N2)。
算法是稳定的,因为当a=b时,由于只有大于才做交换,故a和b的位置没有机会交换,所以算法稳定。
空间复杂度为O(1),不需要额外空间
-插入排序的实现步骤为:从第一个元素开始,该元素可以认为已经被排序 -> 取出下一个元素,在已经排序的元素序列中从后向前扫描 -> 如果该元素小于前一个元素,则将两者调换,再与前一个元素比较–> 重复第三步,直到找到已排序的元素小于或者等于新元素的位置 -> 将新元素插入到该位置中 -> 重复第二步
public void insertSort(int[] source) {
for(int i = 1; i < source.length; i++)
{
for(int j = i; (j > 0) && (source[j] < source[j-1]); j--)
{ swap(j, j-1);
}
}
}
算法分析:插入排序最好的情况是序列已经是升序排列了,在这种情况下,需要进行N-1次比较即可,时间复杂度为O(N),最坏的情况是序列降序排列,这时候时间复杂度为O(N2)。因此插入排序不适合对于数据量比较大的排序应用。但是如果需要排序的数据量很小(如小于千),那么插入排序还是一个不错的选择。插入排序平均时间复杂度为O(N2),但是它要比冒泡排序快一倍,比选择排序还要快一点,经常被用在较复杂的排序算法的最后阶段,例如快速排序。
---------------------