1.快速排序
快速排序的思想是基于分治法的。每一次排序过后,都会确定一个数的位置,然后这个数的左边元素,全部小于这个数。而右边的所有元素中,全部大于这个元素,在确定这个元素的位置过后,分别对两个子序列进行相同排序,这也就形成了递归的过程。跳出条件为左大于等于右,此时也就代表着子序列排序完成。
2.代码
/**
*
***********************************
* @Title: quickSortRecursive
* @Description:
* @param: @param paraStart
* @param: @param paraEnd
* @return: void
***********************************
*/
public void quickSortRecursive(int paraStart, int paraEnd) {
//null
if(paraStart >= paraEnd)
return;
int tempPivot = data[paraEnd].key;
DataNode tempNodeForSwap;
int tempLeft = paraStart;
int tempRight = paraEnd - 1;
while(true) {
while((data[tempLeft].key < tempPivot)&&(tempLeft <tempRight)) {
tempLeft++;
}//Of while
while((data[tempRight].key >= tempPivot) && (tempLeft < tempRight)) {
tempRight--;
}//Of while
//递归跳出的条件
if(tempLeft < tempRight) {
// Swap.
System.out.println("Swapping " + tempLeft + " and " + tempRight);
tempNodeForSwap = data[tempLeft];
data[tempLeft] = data[tempRight];
data[tempRight] = tempNodeForSwap;
}
else {
break;
}//of if
}//of while
// Swap
if (data[tempLeft].key > tempPivot) {
tempNodeForSwap = data[paraEnd];
data[paraEnd] = data[tempLeft];
data[tempLeft] = tempNodeForSwap;
} else {
tempLeft++;
} // Of if
System.out.print("From " + paraStart + " to " + paraEnd + ": ");
System.out.println(this);
quickSortRecursive(paraStart, tempLeft - 1);
quickSortRecursive(tempLeft + 1, paraEnd);
}// Of quickSortRecursive
public void quickSort() {
quickSortRecursive(0, length - 1);
}// Of quickSort
/**
*********************
* Test the method.
*********************
*/
public static void quickSortTest() {
int[] tempUnsortedKeys = { 1, 3, 12, 10, 5, 7, 9 };
String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);
System.out.println(tempDataArray);
tempDataArray.quickSort();
System.out.println("Result\r\n" + tempDataArray);
}// ofquickSortTest
/**
*
***********************************
* @Title: main
* @Description:
* @param: @param args
* @return: void
***********************************
*/
public static void main(String args[]) {
System.out.println("\r\n-------quickSortTest-------");
quickSortTest();
}// Of main
3.总结
快速排序是递归的,需要借助一个递归工作栈来保存每层递归调用的必要信息,最好情况下为O(log2n);最坏情况下,因为要进行n-1次递归调用,所以栈的深度为O(n);平均情况下,栈的深度为O(log2n)。快速排序的运行时间与划分是否对称有关,快排的最坏情况就发生在两个区域分别包含n-1个元素和0个元素时,这种最大程度的不对称性若发生在每层递归上,也就是说对于初始排序表基本有序或者基本逆序时,就得到最坏情况下的时间复杂度。快排应该是所有内部排序算法中平均性能最优的排序算法了。