排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等。插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。
冒泡排序
冒泡排序,不稳定(会改变大部分部分数组数值的位置)
冒泡排序每次出来一个最值是其核心算法所在
冒泡排序的时间复杂度:
冒泡排序的最好情况下时间复杂度为O(n);最坏的情况下时间复杂度为O(n^2)。
冒泡排序的次数:
N个数比较N-1遍。
原理:
对于一个数组,冒泡排序算法会比较相邻的两项的大小,并进行交换。
对每一对相邻的元素做同样的调整,如:第一个和第二个,第二个和第三个,第三个和第四个等等,以此类推。这样下来,最后的元素会是最大的。
重复以上步骤。如果有n个元素,则第一次循环进行n-1次,第二次循环进行n-2次,…………,第n-j次循环过后,会按大小顺序排出j个较大的数。
持续以上的步骤,直到没有任何一堆数字需要比较。
思路:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
举例说明:要排序数组:int[] array={6,3,8,2,9,1};
public class BubbleSort {
/**
* N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
* @param args
*/
public static void main(String[] args) {
int arr[] = {26,15,29,66,99,88,36,77,111,1,6,8,8};
for(int i=0;i < arr.length-1;i++) {//外层循环控制排序趟数
for(int j=0; j< arr.length-i-1;j++) {
//内层循环控制每一趟排序多