Java實現快速排序演算法(Quicktsort)

來源:互聯網
上載者:User

Java實現快速排序演算法(Quicktsort)

 這篇文章主要介紹了Java實現快速排序演算法(Quicktsort),有需要的朋友可以參考一下

快速排序演算法介紹

快速排序和歸併排序都使用分治法來設計演算法,區別在于歸並排序把數組分為兩個基本等長的子數組,分別排好序之後還要進行歸併(Merge)操作,而快速排序拆分子數組的時候顯得更有藝術,取一個基準元素,拆分之後基準元素左邊的元素都比基準元素小,右邊的元素都不小於基準元素,這樣只需要分別對兩個子數組排序即可,不再像歸併排序一樣需要歸併操作。基準元素的選取對演算法的效率影響很大,最好的情況是兩個子數組大小基本相當。為簡單起見,我們選擇最後一個元素,更進階的做法可以先找一個中位元並把中位元與最後一個元素交換,之後再進行相同的操作步驟。拆分是快速排序的核心。快速排序的最壞已耗用時間是O(n2),但期望的已耗用時間是O(nlgn)。

 

快速排序演算法Java實現

1.把數組拆分為兩個子數組加上一個基準元素: 選取最後一個元素作為基準元素,index變數記錄最近一個小於基準元素的元素所在的位置,初始化為start- 1,發現新的小於基準元素的元素,index加1。從第一個元素到倒數第二個元素,依次與基準元素比較,小於基準元素,index加1,交換位置index和當前位置的元素。迴圈結束之後index+1得到基準元素應該在的位置,交換index+1和最後一個元素。

2.分別排序[start, index], 和[index+2, end]兩個子數組

如《插入排序(Insertsort)之Java實現》一樣,先實現一個數組工具類。代碼如下:

 

 

代碼如下:

public class ArrayUtils {

 

     public static void printArray(int[] array) {

      System.out.print("{");

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

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

       if (i < array.length - 1) {

        System.out.print(", ");

       }

      }

      System.out.println("}");

     }

 

     public static void exchangeElements(int[] array, int index1, int index2) {

      int temp = array[index1];

      array[index1] = array[index2];

      array[index2] = temp;

     }

    }

 

 

 

快速排序的Java實現以及測試代碼如下:

 

 

代碼如下:

public class QuickSort {

 

  public static void main(String[] args) {

   int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };

 

   System.out.println("Before sort:");

   ArrayUtils.printArray(array);

 

   quickSort(array);

 

   System.out.println("After sort:");

   ArrayUtils.printArray(array);

  }

 

  public static void quickSort(int[] array) {

   subQuickSort(array, 0, array.length - 1);

  }

 

  private static void subQuickSort(int[] array, int start, int end) {

   if (array == null || (end - start + 1) < 2) {

    return;

   }

 

   int part = partition(array, start, end);

 

   if (part == start) {

    subQuickSort(array, part + 1, end);

   } else if (part == end) {

    subQuickSort(array, start, part - 1);

   } else {

    subQuickSort(array, start, part - 1);

    subQuickSort(array, part + 1, end);

   }

  }

 

  private static int partition(int[] array, int start, int end) {

   int value = array[end];

   int index = start - 1;

 

   for (int i = start; i < end; i++) {

    if (array[i] < value) {

     index++;

     if (index != i) {

      ArrayUtils.exchangeElements(array, index, i);

     }

    }

   }

 

   if ((index + 1) != end) {

    ArrayUtils.exchangeElements(array, index + 1, end);

   }

 

   return index + 1;

  }

 }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.