随机化快速排序
快速排序是一种高效的排序方法,但是如果我们的输入数组是排好序的一个数组,快速排序的运行时间就会变成O(n^2)。虽然这种情况很少会出现,但我们还是应该避免。
算法导论书籍中的修改方法:在排序方法中随机化选取主元。根据计算,改进后的方法时间复杂度的期望为O(nlgn)。
下面是改进后的代码:
/// <summary>
/// 快速排序
/// </summary>
/// <param name="arr"></param>
/// <param name="p"></param>
/// <param name="q"></param>
public void quickSort(int[] arr, int p , int q){
if(p < q){
int r = quatition(arr, p, q);
quickSort(arr, p, r - 1);
quickSort(arr, r + 1, q);
}
}
public int quatition(int[] arr, int p, int q){
int rand = Random.Range(p, q);
//随机化主元
int x = arr[rand];
CommonSortUtil.exchange(arr, p, rand);
int i = p;
for(int j = i + 1; j <= q; j++){
if(arr[j] < x){
i++;
CommonSortUtil.exchange(arr, i, j);
//exchange(arr, i, j);
}
}
CommonSortUtil.exchange(arr, i, p);
return i;
}
其中CommonSortUtil.exchange(arr, i, j)方法为静态方法,功能是交换arr数组中的arr[i]和arr[j]的值。