詳細描述 快速排序 的過程 附Java實現

2021-12-29 16:24:13 字數 2582 閱讀 4233

all is well

快速排序的演算法思想:

快速排序採用了分治的策略,將原問題分解為若干個規模更小但結構與原問題相似的子問題。用遞迴方法解決子問題,然後將這些子問題的解組合為原問題的解。

快速排序的程式的一般過程可簡單描述為:

1.用統一的方法取得 pivot(軸)。

2.根據pivot 對已有陣列進行排序

1) 將array[pivot]儲存在tmp變數中,作為比較基準。

以low、high分別從前向後、從後向前遍歷陣列

2) 從後向前遍歷,找到第乙個小於tmp的數,將其移動到low的位置。

3) 從前向後遍歷,找到第乙個大於tmp的數,將其移動到high的位置。

4) 迴圈2、3步,直到兩指標重疊(即退出迴圈的條件是 low >= high),將tmp移動到low(此時low與high重合)的位置,並將low返回成為新的pivot。

5) 根據4步返回的pivot,對已有陣列進行劃分,0~pivot-1 和 pivot+1 ~ array.lenght,遞迴1~5步。直到呼叫退出。

相信對於以上理論大家一定是耳熟能詳了,但理解起來還是比較抽象,下面我就用excel畫圖簡單的描述一下 快速排序 的過程。

假設我們要寫乙個程式對已有陣列進行排序,簡單起見,設定待排序陣列為 int array = 。對其用快速排序演算法進行排序,過程描述如下:

1.根據已有待排序陣列,取得pivot,我在這裡取得pivot的策略就是 取 陣列的第乙個數,這裡即為 4。

tmp = 4;

待排序陣列:黃色底色表示pivot。

2.從後向前移動high,找到第乙個小於tmp的數,則將該數移動到low的位置。

3.從前向後移動low,找到第乙個大於tmp(4)的數,將其移動到high的位置。

4.然後再向前移動high,試圖找到第乙個小於tmp(4)的數,但沒有找到,此時low與high重疊,將tmp的值放入low的位置,並將low作為pivot返回。

根據新的pivot進行遞迴呼叫,將原待排序陣列 分解為兩塊,index區間分別為0~2,4~7,即以下兩個子陣列

(並未新建陣列,只是只關注這個區間的資料,對其進行排序,也就是將問題分解為兩個小的子問題,但問題很類似。)

這兩個陣列的排序過程這裡就不畫了,一樣的過程。

下面來看看實現的**,與剛剛的過程描述是符合的:package com.bz.sort.algorithm;

public class quicksort

// 排序

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

}/** *//**

* 快速排序。

* @param arr 待排序陣列

* @param left 關注的區間

* @param right 關注的區間

*/private void sort(int arr, int left, int right)

// 取得pivot位置,這裡的策略是取得最小的index,即返回left

int pivot = findpivot(arr, left, right);

// 排序並重新計算出pivot

pivot = partion(arr, left, right, pivot);

// 以pivot為中心將原陣列分解成兩塊,遞迴排序

sort(arr, left, pivot - 1);

sort(arr, pivot + 1, right);

}/** *//**

* 排序並返回新的pivot

* @param arr 待排序陣列

* @param left 區間

* @param right 區間

* @param pivot 軸

* @return

*/private int partion(int arr, int left, int right, int pivot)

arr[low] = arr[high];

// 從前向後遍歷陣列,找到第乙個大於arr[pivot]的數

while (low < high && tmp >= arr[low])

arr[high] = arr[low];

}// 此時low與high重合,將tmp的值移動到low的位置

arr[low] = tmp;

// 將low當作新的pivot返回

return low;

}/** *//**

* 取得排序的軸

* @param array

* @return

*/protected int findpivot(int array, int left, int right)

// 選擇第乙個元素為軸

return left;

}}測試**如下:

package com.bz.sort.algorithm;

import org.junit.test;

import junit.framework.assert;

public class quicksorttest {

@test

public void testsort() {

box shadow屬性的詳細描述和相容性測試

box shadow是css3屬性,用於向框新增乙個或多個陰影,相容ie9 以及火狐 chrome opera等大部分主流瀏覽器。和psd軟體製作相比,box shadow修改元素的陰影效果要簡單得多,因為box shadow可以修改六個引數,來獲取不同的陰影顯示效果。在前面文章css3中的box ...

演算法 快速排序的分析 過程描述以及改進方法

快速排序的基本思想是通過一趟排序將原表劃分成兩個子表,其一乙個子表的元素比另乙個子表的都要小,然後再對兩個子表進行快速排序,直到表中元素有序排列。演算法分析與過程描述 從定義可以看出,快速排序的過程是遞迴的,因此,其排序過程可以描述成對應的一棵遞迴樹。以下分析假設待排序的表有n個元素。當元素基本無序...

請詳細描述一下執行緒從建立到死亡的幾種狀態都有哪些?

1.新建 new 新建立了乙個執行緒物件。2.可執行 runnable 執行緒物件建立後,其他執行緒 比如 main 執行緒 呼叫了該物件 的 start 方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲 取 cpu 的使用權 3.執行 running 可執行狀態 runnable...