中文 英文 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性
选择排序 Selection n2 n2 n2 1 不稳
冒泡排序 Bubble n2 n2 n 1
插入排序 Insertion n2 n2 n 1
堆排序 heap nlog2n nlog2n nlog2n 1 不稳
希尔排序 Shell n1.3 n2 n 1 不稳
归并排序 Merge nlog2n nlog2n nlog2n n
快速排序 Quick nlog2n n2 nlog2n nlog2n 不稳
桶排序 Bucket n + k n2 n n + k
计数排序 Counting n + k n + k n + k n + k
基数排序 Radix n * k n * k n * k n + k

一. 冒泡排序(BubbleSort)

Untitled

public static void BubbleSort(int [] arr){

     int temp;//临时变量
     for(int i=0; i<arr.length-1; i++){   //表示趟数,一共arr.length-1次。
         for(int j=arr.length-1; j>i; j--){

             if(arr[j] < arr[j-1]){
                 temp = arr[j];
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
             }
         }
     }
 }

优化:

public static void BubbleSort1(int [] arr){

   int temp;//临时变量
   boolean flag;//是否交换的标志
   for(int i=0; i<arr.length-1; i++){   //表示趟数,一共 arr.length-1 次

       // 每次遍历标志位都要先置为false,才能判断后面的元素是否发生了交换
       flag = false;
       
       for(int j=arr.length-1; j>i; j--){ //选出该趟排序的最大值往后移动

           if(arr[j] < arr[j-1]){
               temp = arr[j];
               arr[j] = arr[j-1];
               arr[j-1] = temp;
               flag = true;    //只要有发生了交换,flag就置为true
           }
       }
       // 判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
       if(!flag) break;
   }
}