冒泡排序
给一组数字,要求从小到大排序;
1.时间复杂度 O(n2) ,空间复杂度 O(n+1);
2.基本思想:两个数比较大小,较小的数下沉,较大的数冒起来;
3.冒泡过程:
1.从第零个位置开始,第零个位置的数和第一个位置的数比较,大的交换到第一个位置(冒出来);然后第一个位置的数和第二个位置上的数比较大小,大的数交换到第二个位置(冒出来);
依次类推,遍历到倒数第二个数的时候,最大的值就冒出来了,排在最后的位置;
2.然后排序剩余的数;以为最后以为已经是最大的了,不需要改变,所以只排序剩余的数;
4.代码:
public void bubbleSort(int[] array, int length){ //排序的趟数,如果2个数,需要排1次,所以排序趟数为length - 1; for(int i = 0; i < length - 1; i++) { //冒泡的过程 for(int j = 0; j < length - 1 - i; j++) { if(array[j] > array[j + 1]){ int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
5.优化:如果已经有序,冒泡排序依然进行;设置一个标志位,如果冒泡过程中没有交换位置,证明已经有序,结束排序;
public void bubbleSort1(int[] array, int length){ //标志位,如果冒泡的过程没有发送交换,证明已经有序,结束排序; Boolean flag; //排序的趟数,如果2个数,需要排1次,所以排序趟数为length - 1; for(int i = 0; i < length - 1; i++) { //冒泡的过程 flag = false; for(int j = 0; j < length - 1 - i; j++) { if(array[j] > array[j + 1]){ int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; flag = true; } } if(!flag) { break; } } }