学习《轻松学算法》之冒泡排序
概念引入:
对排序的数字,定好排序的方向,假如是从大到小排序,每一轮 两两相比较,把小的数字都靠到后面。
原理:
假设我们要从小到大排序一个数组,我们需要将大的元素往后移。
1 i=0
2 开始比较相邻的元素,如果前面的元素比后面的元素大,则交换,否则不做,除了已经排好的元素。
3 数组下标后移一位 i++
4 重复2,直到没有可以比较的数字
例子:
待排序:4,5,2,7,4,3
第一轮:4,2,5,4,3,7
第二轮:2,4,4,3,5,7
第三轮:2,4,3,4,5,7
第四轮:2,3,4,4,5,7
第五轮:2,3,4,4,5,7
package com.xxc.algorithm.bubblesort;
public class BubbleSort {
private int[] array;
public BubbleSort(int[] array) {
this.array = array;
}
/**
* 从大到小
*/
public void sort() {
int length = array.length;
if (length > 0) {
// 从前往后将小的往后移
for(int i = 0;i<length;i++) { //从头遍历到尾
for(int j=0;j<length-i-1;j++) { //排除已经排序的数字
if(array[j]<array[j+1]) {
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
}
/**
* 从小到大
*/
public void sort2() {
int length = array.length;
if (length > 0) {
// 从前往后将大的往后移
for(int i = 0;i<length;i++) {
for(int j=0;j<length-i-1;j++) {
if(array[j]>array[j+1]) {
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
}
public void print() {
System.out.println("---");
for(int i = 0;i<array.length;i++) {
System.out.println(array[i]);
}
}
}
package com.xxc.algorithm.bubblesort;
public class SortTest {
public static void main(String[] args) {
testBubbleSort();
}
public static void testBubbleSort() {
int[] array = {5,9,1,9,5,3,7,6,1};
BubbleSort bubbleSort = new BubbleSort(array);
bubbleSort.sort();
bubbleSort.print();
bubbleSort.sort2();
bubbleSort.print();
}
}
特点:
每轮排序中,会使一个元素排到一头,需要n-1轮排序,每轮排序需要两两相邻的数进行比较。最坏的情况,时间复杂度O(n2),最好O(n),平均O(n2)
空间复杂度O(1)
稳定,两个相邻元素相同时,不会进行交换。