日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速排序算法(java实现)

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序算法(java实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 基本思想

快速排序是一種采用分治法解決問題的一個典型應用,也是冒泡排序的一種改進。它的基本思想是,通過一輪排序將待排記錄分割成獨立的兩部分,其中一部分均比另一部分小,則可分別對這兩部分繼續進行排序,已達到整個序列有序。排序的時間復雜度為 O(nlogn),相比于簡單排序算法,運算效率大大提高。

  • 算法步驟

  • 從序列中取出一個數作為中軸數;

  • 將比這個數大的數放到它的右邊,小于或等于他的數放到它的左邊;

  • 再對左右區間重復第二步,直到各區間只有一個數。

    例如,對以下 10 個數進行快速排序:

    6 1 2 7 9 3 4 5 10 8

    以第一個數為基準數,在初始狀態下,數字 6 在序列的第 1 位,我們的目標是將 6 挪到序列中間的某個位置,假設這個位置是 k 。

    現在就需要尋找這個 k ,并且以第 k 位為分界點,左邊的數都≤6,右邊的數都≥6。那么如何找到這個位置 k 呢?

    我們要知道,快速排序其實是冒泡排序的一種改進,冒泡排序每次對相鄰的兩個數進行比較,這顯然是一種比較浪費時間的。

    而快速排序是分別從兩端開始”探測”的,先從右往左找一個小于 6 的數,再從左往右找一個大于 6 的數,然后交換他們。這里可以用兩個變量 i 和 j ,分別指向序列最左邊和最右邊。

    我們為這兩個變量起個好聽的名字哨兵 i 和哨兵 j

  • 我們首先讓哨兵 i 指向序列的最左邊,指向數字 6;讓哨兵 j 指向序列的最右邊,指向數字 8,如下圖所示。

  • ??2.首先哨兵 j 開始出動。因為此處設置的基準數是最左邊的數,所以需要讓哨兵 j 先出動,這一點非常重要。

    • 哨兵 j 一步一步地向左挪動,直到找到一個小于 6 的數停下來
    • 然后哨兵 i 再一步一步向右挪動,直到找到一個數大于 6 的數停下來

    3.最后哨兵 j 停在了數字 5 面前,哨兵 i 停在了數字 7 面前,如下圖所示:

    ?

    4.現在交換哨兵 i 和哨兵 j 所指向元素的值,交換之后的序列如下:

    ?

    5.到此,第一次交換結束。接下來開始哨兵 j 繼續向左挪動(再友情提醒,每次必須是哨兵 j 先出發)。他發現了 4<6,停下來。哨兵 i 也繼續向右挪動的,他發現了 9>6,停下來。此時再次進行交換,交換之后的序列如下

    6.第二次交換結束。哨兵 j 繼續向左挪動,他發現了 3<6,又停下來。

    7.哨兵 i 繼續向右移動,此時哨兵 i 和哨兵 j 相遇了,哨兵 i 和哨兵 j 都走到 3 面前。

    說明此時“探測”結束。我們將基準數 6 和 3 進行交換。交換之后的序列如下。

    ?

    ?

    到此第一輪“探測”真正結束。

    現在基準數 6 已經歸位,此時以基準數 6 為分界點,6 左邊的數都小于等于 6,6 右邊的數都大于等于 6。

    現在我們將第一輪“探測”結束后的序列,以 6 為分界點拆分成兩個序列,左邊的序列是“3 1 2 5 4”,右邊的序列是“9 7 10 8”。接下來還需要分別處理這兩個序列,因為 6 左邊和右邊的序列目前都還是混亂的。不過不要緊,我們已經掌握了方法,接下來只要模擬剛才的方法分別處理 6 左邊和右邊的序列即可。

    實際上快速排序的每一輪處理其實就是將這一輪的基準數歸為,直到所有的數都歸為為止,排序就結束了。

    實現代碼

    package Sort;public class 快速排序 {public static void main(String[] args) {int[] arr = {6,1,2,7,9,3,4,5,10,8};sort(arr, 0, arr.length-1);print(arr); }public static void sort(int[] arr,int leftBound,int rightBound) {if(leftBound >= rightBound) return;int mid= partition(arr, leftBound, rightBound); //得到軸的位置sort(arr, leftBound, mid-1); //左邊排序sort(arr, mid+1, rightBound); //右邊排序}static int partition(int[] arr, int leftBound,int rightBound) {int pivot = arr[rightBound]; //指定數組最右邊的數是用來比較的值 軸int left = leftBound;int right = rightBound - 1;while (left <= right) {while(left <= right && arr[left] <= pivot) left++;while(left <= right && arr[right] > pivot) right--;if (left < right) {//如果 左邊的數比右邊的數小 兩個數交換swap(arr, left, right);}}//把left最后一次指向的位置與pivot(軸)的位置交換swap(arr, left, rightBound);return left; //返回軸的位置}static void swap(int[] arr,int i,int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}static void print(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}} }

    總結

    以上是生活随笔為你收集整理的快速排序算法(java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。