1. 程式人生 > >三種常用排序演算法(冒泡、選擇、快速)的Java實現

三種常用排序演算法(冒泡、選擇、快速)的Java實現

       學習Java有一陣子了,現在還處於比較初級的水平,能夠把簡單的程式寫對就不錯了,更不用談現在能夠拿Java做什麼了。

       學完了兩段網路視訊課程,接下來找本書簡單看看。只要有了一個初步的認識,接下來的東西應該可以更加順利一些。學習程式設計最好的方法就是練手了,現在還不知道有什麼比較好的東西可以嘗試,不過跑不出一般教程的排序演算法還是可以嘗試一下的。

1,氣泡排序演算法

packagebubble_sort;

public class bubble_sort {

    public static void main(String[] args) {

        //

TODO Auto-generated method stub

        int[] array_data = {1,5,3,6,2,4,7,8,4,12,55,22,99,47,12};

        int i,j;

        int array_length;

        array_length = array_data.length;

        System.out.println("data before sorted:");

        /* display numbers before sorted. */

        for(i = 0;i

<array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

        for(i = 0;i<array_length;i++)

        {

           for(j = i;j<array_length;j++)

           {

               if(array_data[j] < array_data[i])

               {

                   array_data[i

] = array_data[i] ^ array_data[j];

                   array_data[j] = array_data[i] ^ array_data[j];

                   array_data[i] = array_data[i] ^ array_data[j];

               }

           }

        }

        System.out.println();

        System.out.println("data after sorted:");

        /* display numbers before sorted. */

        for(i = 0;i<array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

    }

}

程式執行結果;

databefore sorted:

1, 5,3, 6, 2, 4, 7, 8, 4, 12, 55, 22, 99, 47, 12,

dataafter sorted:

1, 2, 3, 4, 4, 5, 6, 7, 8, 12, 12, 22, 47,55, 99,

    工作以來,遇到的軟體問題都不是很複雜。如果需要排序演算法,基本加單冒泡一下就可以了。我處理的資料量通常不大,這種簡單有效的方式還是不錯的。之所以先嚐試這種演算法,沒別的,就是因為這種簡單的演算法使用已經成為了習慣。UNIX的程式設計思想不也推崇這種理念嘛——簡單勝於機巧!

2,選擇排序

程式碼:

packageSelectSortPack;

public class SelectSort {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int[] array_data = {1,5,3,6,2,4,7,8,4,12,55,22,99,47,12};

        int i,j,array_length,index_min;

        System.out.println("data before sorted:");

        array_length = array_data.length;

        for(i = 0;i< array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

        System.out.println();

        /* sort function */

        for(i = 0;i < array_length;i++)

        {

           index_min = i;

           for(j = i + 1;j < array_length;j++)

           {

               if(array_data[j] < array_data[index_min])

               {

                   index_min = j;

               }

           }

           if(index_min != i)

           {

               array_data[i] = array_data[i] ^ array_data[index_min];

               array_data[index_min] = array_data[i] ^ array_data[index_min];

               array_data[i] = array_data[i] ^ array_data[index_min];

           }

        }

        System.out.println("data after sorted:");

        for(i = 0;i< array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

    }

}

程式執行結果:

databefore sorted:

1, 5,3, 6, 2, 4, 7, 8, 4, 12, 55, 22, 99, 47, 12,

dataafter sorted:

1, 2,3, 4, 4, 5, 6, 7, 8, 12, 12, 22, 47, 55, 99,

       自我感覺,選擇排序和氣泡排序的設計思想差不多。不同的地方在於:選擇排序是通過比較後標記陣列的索引號來確定最終的交換物件。

3,快速排序

程式碼;

packageQuickSortPack;

public class QuickSortClass {

    public static int Partialize(int[] array,int low_index,int high_index)

    {

        int base_value;

        base_value = array[low_index];

        while(high_index > low_index)

        {

           while((array[high_index] >= array[low_index])&&(high_index > low_index))

           {

               high_index -= 1;

           }

           array[low_index]  = array[low_index] ^ array[high_index];

           array[high_index] =  array[low_index] ^ array[high_index];

           array[low_index]  = array[low_index] ^ array[high_index];

           while((array[low_index] <= array[high_index])&&(high_index > low_index))

           {

               low_index += 1;

           }

           array[low_index]  = array[low_index] ^ array[high_index];

           array[high_index] =  array[low_index] ^ array[high_index];

           array[low_index]  = array[low_index] ^ array[high_index];

        }

        array[high_index] = base_value;

        /* return the index of base_value */

        return high_index;

    }

    public static void SortArray(int[] array,int low_index,int high_index)

    {

        if(low_index >= high_index)

        {

           return;

        }

        int base_value_index = Partialize(array,low_index,high_index);

        SortArray(array,low_index,base_value_index - 1);

        SortArray(array,base_value_index + 1,high_index);

    }

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int[] array_data = {1,5,3,6,2,4,7,8,4,12,55,22,99,47,12};

        int i,array_length;

        array_length = array_data.length;

        /* display raw data */

        System.out.println("data before sorted:");

        for(i = 0;i < array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

        System.out.println();

        SortArray(array_data,0,array_length - 1);

        /* display result data */

        System.out.println("data after sorted:");

        for(i = 0;i < array_length;i++)

        {

           System.out.print(array_data[i] + ",");

        }

    }

}

結果:

databefore sorted:

1, 5,3, 6, 2, 4, 7, 8, 4, 12, 55, 22, 99, 47, 12,

dataafter sorted:

1, 2,3, 4, 4, 5, 6, 7, 8, 12, 12, 22, 47, 55, 99,

       關於快速排序演算法,我查詢資料重新看了好久。在好多資料以及文章面前,我有點無法確認什麼叫做快速排序演算法了。最終,在維基百科上找到了算是比較詳細的描述。其實,快速排序演算法也有很多變種,如果把多種變種混合起來理解有時候會有一些麻煩。最後,在演算法實現的時候我還是挑選了一個比較容易懂的描述方式來實現。不過,這個演算法的效率似乎並不是最出眾的了,沒有充分發揮快速排序演算法的優勢。

       簡單對我所用的排序演算法做一個小結:其實,這個跟我瞭解的歸併排序還是有一點相似的地方的,都是對處理的資料物件進行分割處理。不同的是,快速排序是直接運算元組物件,不需要額外的臨時儲存空間。這樣,也少了合併階段的麻煩。

       大致的思路:首先以第一個陣列元素為基準,從陣列的最後面開始向前掃描。如果後面有更小的數值就與基準元素交換。接著,暫時不管掃描過得資料,再從前面掃描一次,同時做同樣的操作。這樣,當從前往後掃描的掃麵點與從後往前的掃描點重合或者交叉時,一次分組就完成了。然後分別對交叉點左右兩邊的兩組元素進行類似的遞迴操作,最後完成所有的排序。