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...