1. 程式人生 > >關於Sort排序與冒泡法的區別

關於Sort排序與冒泡法的區別

Sort排序和冒泡法的異同

對陣列a{2,4,3,6,2,8,1}進行排序。

快速排序法

原理:

對於陣列a{2,4,3,6,2,8,1}

①  需要選取一個關鍵元素作為基準元素key,用陣列內所有元素跟基準元素比較大小

②  先假設陣列內第一個元素的角標為i,最後一個元素角標為j

③  先將陣列元素最後一個元素跟基準元素比較,若a[j]>key,則j--,直到a[j]<key,然後進行交換,大的放後面,小的放前面。接著進行第④步;

④  將陣列元素第一個元素與基準元素比較,所a[i]<key,則i++,直到a[i]>key,然後進行交換。

⑤  重複③④步,直到i==j,第一趟比較結束。(第一趟比較結束時,基準元素key一般在陣列元素的中間位置,然後以基準元素key為中軸,將陣列劃分為兩個子陣列,key左邊的子陣列都小於key,右邊的子陣列都大於key.)

注:若key為陣列元素的最小值,第一趟比較結束時,只比較key右邊的子陣列,再重新選子陣列的基準元素key1,然後進行比較。

若陣列為空時,則輸出一個空的序列。

若陣列不合法時,也輸出空序列。

關鍵點:1.找基準元素;

通常選取陣列內第一個元素為基準元素;

     2. 設第一個元素角標為i;

設最後一個元素角標為j;

       3.先由後往前跟基準元素比較,在右前往後比較;

       4.劃分子陣列。

關於程式碼:

程式碼一: 

package shuzu;

public classQuickSort {

     public voidsort(int[] arras,int

low,inthigh) {    

         int i=low;

         int j=high;

         if(i>j){

             /*使用了快速排序

             arras:要排序的陣列

             low:陣列的開始下標

             high:陣列的末尾下標

             */

             return;

         }

         int key=arras[low]; //選基準元素(一般都陣列內第一個元素)

         while(true){      //

讓一趟裡面全部元素比較完畢

             while(j>i){   //j角標開始往前比較

                 if(arras[j]<key){  //交換

                     int temp=arras[j];

                     arras[j]=arras[i];

                     arras[i]=temp;

                     break;

                 }else{

                     j--;

                 }

             }

             while(j>i){   //i角標開始往後比較

                 if(arras[i]>key){    //交換

                     int temp=arras[j];

                     arras[j]=arras[i];

                     arras[j]=arras[i];

                     arras[i]=temp;

                     break;

                 }else{

                     i++;

                 }

             }

             if(i==j){   //終止最外層迴圈,表示一趟比較結束

                 break;

             }

         }    //此時的i=j是基準元素的角標

         sort (arras,low,i-1);  //基準元素左邊

         sort (arras,i+1,high);  //基準元素右邊

     }

     public voidprint(int[]arras ){    //列印陣列元素

         for(inti=0;i<arras.length;i++){

             if (i==arras.length-1){

                 System.out.print(arras[i]);

             }else{

                 System.out.print(arras[i]+",\t");

             }

         }

     }

     public staticvoidmain(String[] args){

         int[] arras ={2,4,3,6,2,8,1};

         QuickSort qs=new QuickSort();

         qs.sort(arras,0,arras.length-1);

         qs.print(arras);

     }

}

對於上面的程式碼,還有有幾個需要進一步理解的地方。

1.上面的sort(arras,low,i-1)是不是排序arras[low]到arrow[i-1]?沒見過這種表示方法,所以有點看不明白。

2.

為什麼定義low和high得在sort()內?

3.

對於qs.sort()這種表示也有迷惑,是不是說2、3兩個問題都是一種簡潔的表示方法?就像課件裡的程式碼那種簡潔的表示?

程式碼二:

package shuzu;

import java.util.Arrays;

    public class sort {

         public static void main(String[] args) {

              int[] a = new int[]{2,4,3,6,2,8,1};

              Arrays.sort(a);

              for(inti:a){

                System.out.print(a[i]+"\t");

              }

         }

    }

或者是

package shuzu;

import java.util.Arrays;

    public class sort {

         public static void main(String[] args) {

              int[] a = new int[]{2,4,3,6,2,8,1};

              Arrays.sort(a);

              for (int i = 0; i < a.length; i++) {

              //for(int i:a){

                System.out.print(a[i]+"\t");

              }

         }

    }

這樣也是可以的

冒泡法排序

原理:

對於陣列a{2,4,3,6,2,8,1}

①  陣列內元素兩兩比較,先從前兩個開始

②  本著讓最大的元素放到最後的原則,若a[i]<a[i+1],則i++繼續比較;若a[i]>a[i+1],則交換位置。

③  交換位置後,小的元素在前大的元素在後,然後繼續用大的元素跟後面元素比較,直到最後,此時該陣列最大元素到了最後的位置上,一趟比較結束。

④  一趟比較結束後,繼續②③,(這時候,最後一個已經沉底的元素就不需要參與比較了)讓次大元素沉到倒數第二的位置上。一直迴圈,直到將所有元素排列好為止。

注:第一趟比較需進行a.length-1次比較;

第i趟比較需進行a.length-1-i次。

   關鍵點:

        冒泡法的關鍵點就在於a.length-1-i次比較有點不好理解,我感覺的話冒泡法還是比快速排序好理解一點,雖然快速排序法寫起來很簡單。

附程式碼:

寫法一

package shuzu;

    public class MParray {

         public static void main(String[] args) {

              int[] a = new int[]{2,4,3,6,2,8,1};//定義一個int型陣列a,並輸入陣列元素

             int temp=0;   //定義一個臨時變數

              for(int i=0;i<a.length-1;i++){   

              for(intj=0;j<a.length-1-i;j++){

                     if(a[j]>a[j+1]){  //比較相鄰兩個元素的大小,並交換

                      temp=a[j];

                      a[j]=a[j+1];

                      a[j+1]=temp;

                      }

                   }

                 }

              /*利用冒泡法排序

並用了兩個for迴圈巢狀

                */

                       for(int i=0;i<a.length;i++){ 

                       System.out.print(a[i]+"\t");  //再利用一個for迴圈,遍歷排序後的陣列元素

              }

             }

           }

寫法二

package shuzu;

public classBubbleSort{

      public staticvoidmain(String[] args) {

          int[] a = new int[]{2,4,3,6,2,8,1};

        int temp = 0;

        for (int i = a.length - 1; i > 0; --i){

            for (int j = 0; j < i; ++j){

                if (a[j + 1] < a[j]){

                    temp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

        }

        for(int i=0;i<a.length;i++){ 

            System.out.print(a[i]+"\t");

   }

 }

}

關於寫法二,寫法二是我從網上找資料的時候看到的,跟所學的不一樣,然後拿過來試一試,一樣能執行成功,

在for迴圈語句中,i++和++i並沒有什麼區別。

總結:

快速排序法的基本思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

冒泡法的基本思想:重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

快速排序法是在冒泡法的基礎上改進而來,其新的寫法比冒泡法更容易書寫。就像老師說的,在家用Sort排序,在外面用冒泡法,兩種方法交替使用,使得可以面對的情況更寬。

通過這兩天對Sort排序法資料的研究與整理,真的是受益匪淺。這不僅使我明白了Sort排序的原理,也加深了對冒泡法的理解,更讓我對於java或者說敲程式碼的理解更進一層。我發現對於以前看著就頭疼的程式程式碼,現在也是越來越有興趣了,也享受到了學習的樂趣,這是在進入大學以後第一次感受到的。

我喜歡這樣的生活,喜歡這裡的老師,也喜歡這裡的氛圍,感謝惠普!