Java數據結構和算法:冒泡、選擇、插入排序算法

 冒泡排序:規則就是前後比較,找到最大的放在最右端,然後依次循環比較。。。。其中需要兩個循環來完成該任務,外層循環標記比較的趟數,內層循環標識每一趟需要交換元素的下標。關鍵需要設置一個標識位,用來標識在某一趟中,是否有交換,如果沒有交換,說明已經排好序了,就可以直接停止遍歷循環比較了。

public class BubbleSort {
    public static int[] sort(int [] array){
//        這裏for循環表示總共需要比較多少輪
        for (int i = 1; i <array.length ; i++) {
//            設置標記,若爲true,則表示此次循環沒有進行交換,也就是排序已經完成
            boolean flag = true;
//            這裏for循環表示每輪比較參與的元素下標
//            對當前無序的數組進行排序
//            j的範圍很關鍵,隨着輪數的增加,j的範圍會不斷縮小
            for (int j = 0; j <array.length-i ; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = false;
                }
            }
            if(flag){
                break;
            }
//            第i輪的交換結果
            System.out.println("第"+i+"輪排序後的結果");
            display(array);
        }
        return array;
    }
    public static void display(int [] array){
        for (int i = 0; i <array.length-1 ; i++) {
            System.out.print(array[i]+ "  ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int [] array ={2,1,4,10,12,3,5,7,6,9,8};
        System.out.println("未排序的結果");
        display(array);
        int[] sort = sort(array);
        System.out.println("排序的結果");
        display( sort);
    }
}

冒泡排序的時間複雜度:

最好的情況是比較一趟並沒有交換,則時間複雜度爲O(n);

最差時間複雜度爲每一趟都需要交換,則n+n-1+.....+1=n(n-1)/2即O(n^2)

選擇排序:

選擇排序是每次從待排序的元素中選出最小的元素,存放在序列的起始位置,直到全部待排序的數據元素排完。

分爲三步:

1.從待排序列中,找到最小的元素

2.如果最小的元素不是待排序序列的第一個元素,將其和第一個元素交換位置

3.從餘下的N-1個元素中,找出最小的元素,重複(1)、(2)步,直到排序結束。

package 數據結構;

public class ChoiceSort {
    public static int []  sort(int [] array){
//        總共需要經過length-1輪的比較
        for(int i =0; i<array.length-1;i++){
            int min = i;
            //每輪需要比較的次數
          for(int j = i+1; j<array.length;j++){
              if(array[min]>array[j]){
                  min = j;//記錄目前能找到的最小值的下標
              }
          }
//          找到最小值和i位置所在的值進行比較,如果不同,則需要進行交換值
          if(i!=min){
              int temp = array[i];
              array[i] = array[min];
              array[min] = temp;
          }
            System.out.println("第"+(i+1)+"輪排序的結果");
         display(array);
        }
        return array;
    }
//    遍歷數組元素
    public static void display(int [] array){
        for (int i = 0; i <array.length-1 ; i++) {
            System.out.print(array[i]+ "  ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int [] array ={2,1,4,10,12,3,5,7,6,9,8};
        System.out.println("未排序的結果");
        display(array);
        int[] sort = sort(array);
        System.out.println("排序的結果");
        display( sort);
    }
}

選擇排序的時間複雜度與冒泡排序的時間複雜度相同。

插入排序

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章