快速排序的基本思想:
分治法,即,分解,求解,組合 .
分解:
在 無序區R[low..high]中任選一個記錄作為基準(通常選第一個記錄,并記為Pivot,其下標為pivotpos),以此為基準劃分成兩個較小的 子區間R[low,pivotpos - 1]和R[pivotpos + 1 , high],并使左邊子區間的所有記錄均小于等于基準記錄,右邊子區間的所有記錄均大于等于基準記錄,基準記錄無需參加后續的排序。而劃分的關鍵是要求出 基準記錄所在的位置pivotpos.
求解:
通過遞歸調用快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序
組合:
當"求解"步驟中的兩個遞歸調用結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什么,可看作是空操作。
具體過程:
設序列為R[low,high],從其中選第一個為基準,設為pivot,然后設兩個指針i和j,分別指向序列R[low,high]的起始和結束位置上:
1),將i逐漸增大,直到找到大于pivot的關鍵字為止;
2),將j逐漸減少,直到找到小于等于pivot的關鍵字為止;
3),如果i<j,即R[i,j]的元素數大于1,則交換R[i]和R[j];
4),將基準記錄pivot放到合適的位置上,即i和j同時指向的位置,則此位置為新的pivotpos。
備注:
快速排序是不穩定排序,即相同的關鍵字排序后,相對位置是不確定的。
示例代碼:

public class DataStructure_QuickSort
{
//劃分子區間,計算基準位置
int Partition(int[] arr , int nLower ,int nUpper)
{
int pivot = arr[nLower] ;//取第一個記錄為基準記錄
int nLeft = nLower + 1; //加1,pivot無需和自身做比較
int nRight = nUpper ;

int temp ;
do{
while (nLeft <= nRight && arr[nLeft] <= pivot) //將nLeft逐漸增大,直到找到大于pivot的下標為止
nLeft++ ;

while (nLeft <= nRight && arr[nRight] > pivot) //從nRight逐漸減少,直到找到小于等于pivot的下標為止
nRight-- ;

//R[nLeft,nRight]區間的長度(元素數)大于1時,交換R[nLeft]和R[nRight]
if (nLeft < nRight)
{
temp = arr[nLeft] ;
arr[nLeft] = arr[nRight] ;
arr[nRight] = temp ;

nLeft++;
nRight--;
}
} while (nLeft < nRight); //當nLeft == nRight的時候停止循環

//把基準記錄pivot放到正確位置,即nLeft和nRight同時指向的位置
temp = arr[nLower];
arr[nLower] = arr[nRight];
arr[nRight] = temp ;

return nRight ;
}

public void QuickSort(int[] arr, int nLower, int nUpper)
{
int pivotpos; //基準下標
if (nLower < nUpper) //僅當區間范圍長度大于1時才須排序
{
pivotpos = Partition(arr, nLower, nUpper);//劃分子區間,知道基準下標(QuickSort的關鍵)
QuickSort(arr, nLower, pivotpos - 1); //對左區間遞歸排序
QuickSort(arr, pivotpos + 1, nUpper); //對右區間遞歸排序
}
}
}
分治法,即,分解,求解,組合 .
分解:
在 無序區R[low..high]中任選一個記錄作為基準(通常選第一個記錄,并記為Pivot,其下標為pivotpos),以此為基準劃分成兩個較小的 子區間R[low,pivotpos - 1]和R[pivotpos + 1 , high],并使左邊子區間的所有記錄均小于等于基準記錄,右邊子區間的所有記錄均大于等于基準記錄,基準記錄無需參加后續的排序。而劃分的關鍵是要求出 基準記錄所在的位置pivotpos.
求解:
通過遞歸調用快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序
組合:
當"求解"步驟中的兩個遞歸調用結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什么,可看作是空操作。
具體過程:
設序列為R[low,high],從其中選第一個為基準,設為pivot,然后設兩個指針i和j,分別指向序列R[low,high]的起始和結束位置上:
1),將i逐漸增大,直到找到大于pivot的關鍵字為止;
2),將j逐漸減少,直到找到小于等于pivot的關鍵字為止;
3),如果i<j,即R[i,j]的元素數大于1,則交換R[i]和R[j];
4),將基準記錄pivot放到合適的位置上,即i和j同時指向的位置,則此位置為新的pivotpos。
備注:
快速排序是不穩定排序,即相同的關鍵字排序后,相對位置是不確定的。
示例代碼:

















































因為我們學的很少 也 很簡單 。。。