冒泡排序

给一组数字,要求从小到大排序;

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;
            }
        }
    }

      

           

原文地址:https://www.cnblogs.com/smailjunk/p/10441659.html