快速排序基於分治思想,期望時間複雜度可以達到O(nlgn),並且是一種穩定的排序算法。
/**
* 快速排序,選取最後一個元素作爲參考,輸出數組的非遞減序列
* @param array 待排序的數組
* @param start 要排序數組的開始位置
* @param end 要排序數組的結束位置
*/
public void quickSort(int array[] , int start , int end)
{
if(array == null || array.length < 2 || start >= end)
{
return;
}
//選取最後一個元素作爲參考
int flag = array[end];
//記錄大於flag的第一個元素位置
int i = start-1;
//標識當前遍歷的位置
int j = start ;
while(j < end)
{
//當元素小於flag時,與++i進行交換
if( array[j] < flag)
{
i++;
swap(array,i,j);
}
j++;
}
//將flag交換到合適的位置
int mid = i + 1;
swap(array,mid,end);
//對左右子數組進行遞歸排序
quickSort(array,start,mid -1);
quickSort(array,mid + 1,end);
}
/**
* 快速排序,選取最後一個元素作爲關鍵值,輸出數組的非遞減序列
* @param array 待排序的數組
* @param start 要排序數組的開始位置
* @param end 要排序數組的結束位置
*/
public void quickSort2(int array[] , int start , int end)
{
if(array == null || array.length < 2 || start >= end)
{
return;
}
int flag = array[end];
//1.從左向右遍歷,尋找比flag大的元素left
//2.從右向左遍歷,尋找比flag小的元素right
//3.交換元素位置,直到left >= right , 將參考值交換到合適的位置
int left = start;
int right = end;
while(left < right)
{
if(array[left] <= flag)
{
left++;
}else if(array[right] >= flag)
{
right--;
}else
{
swap(array,left,right);
}
}
//將flag交換到合適的位置
swap(array,left,end);
//對左右子數組進行遞歸排序
quickSort2(array,start,left -1);
quickSort2(array,left + 1,end);
}
/**
* 交換數組中兩元素的位置
* @param array
* @param x
* @param y
*/
private void swap(int array[] , int x , int y)
{
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}