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

來源:互聯網
上載者:User

 這篇文章主要介紹了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.