public
class
quicksort
/*** 快速排序主例程
* *@param a 原始陣列
*@param left 起始索引
*@param right 結束索引
*@param
實現了 comparable介面的類或其子類
*/private
static
super anytype>> void
quicksort(anytype a, int left, int right)
// 大元素指標向左推進, 遇到比樞紐元小的元素終止
while (a[--j].compareto(pivot) > 0)
// 兩個索引未交叉時, 代表大小序列還未分割完成, 交換位置後繼續分割
// 交叉時代表分割完成
if (i < j)
swap(a, i, j);
else
break;
}// 分割完成後, 將樞紐元和小元素索引終止處的元素位置互換
// 此時, 樞紐元左側都為小元素, 右側都為大元素 (相對於樞紐元而言)
swap(a, i, right - 1);
// 對分割後的子串行重複上面操作
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
} else
}/**
* 對陣列的指定部分使用插入排序
*@param a 原始陣列
*@param left 起始索引
*@param right 結束索引
*@param
實現了 comparable介面的型別或其子類
*/private
static
super anytype>> void
insertionsort(anytype a, int left, int right)
anytype tmp;
int j;
for (int i = left + 1; i <= right; i++)
a[j] = tmp;}}
/**三數中值分割法
使用左端, 右端和中心位置上的三個元素的中值作為樞紐元
*/private
static
super anytype>> anytype median3(anytype a, int left, int right)
if (a[right].compareto(a[left]) < 0)
if (a[right].compareto(a[center]) < 0)
// 將樞紐元和右端倒數第二個元素交換位置, 使樞紐元離開陣列, 便於元素比較
swap(a, center, right - 1);
// 將樞紐元返回
return a[right - 1];
}/**
* 交換陣列中兩個元素的位置
*/private
static
super anytype>> void
swap(anytype arr, int i, int j)
anytype tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}}
排序演算法分析 快速排序
假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,選擇中間位置的元素作為基準值 pivot value 其索引為 0 n 1 2 從第0個元素開始從左往右找到比基準值大的元素,其索引為i從第n 1個元素開始從右往左找到比基準值小的元素,其索引為j交換這兩個元素 從索引i...
快速排序演算法分析
快速排序演算法 include include void quicksort int arr,int nleft,int nright i nleft j nright int nmid nleft nright 2 int nmidval arr nmid while i j from right...
快速排序演算法分析
經常在面試時會有面試官要求直接寫出快速排序演算法,因為該演算法在排序演算法中占有非常重要的地位,它排序效率高,達到o nlogn 最壞的情況也是o n 2 它的思想為對於乙個待排序的序列,首先隨機選取乙個元素作為樞軸,然後通過元素值的比較,將整個序列分成兩部分,前一部分所有元素都小於或等於該樞軸元素...