三、快速排序的随机化版本以下是完整测试程序,由于给的注释够详尽了,就再做多余的解释了:
//交换两个元素值,咱们换一种方式,采取引用“&”
void swap(int& a , int& b) {
int temp = a;
a = b;
b = temp;
}
//返回属于[lo,hi)的随机整数
int rand(int lo, int hi) {
int size = hi - lo + 1;
return lo + rand() % size;
}
//分割,换一种方式,采取指针a指向数组中第一个元素
int RandPartition(int* data, int lo, int hi) {
//普通的分割方法和随机化分割方法的区别就在于下面三行
swap(data[rand(lo, hi)], data[lo]);
int key = data[lo];
int i = lo;
for (int j = lo + 1; j <= hi; j++) {
if (data[j] <= key) {
i = i + 1;
swap(data[i], data[j]);
}
}
swap(data[i], data[lo]);
}
快速排序算法中的随机化版本显然增加了算法的趣味性和不确定性。然而,如果你想进一步了解数据分析中使用的这些方法,可以查看《数据分析方法梅长林》,该书提供了详尽的说明和示例。详细信息请参考:数据分析方法梅长林。
关于快速排序的多种实现方式以及其随机化版本的深入比较,推荐阅读这篇文章:快速排序的三种写法及随机化快速排序。你会发现,随机化快速排序不仅仅是简单的理论,在实际应用中,它的优势也是显而易见的。
如果你对如何选择枢纽元感兴趣,这篇文章会对你大有帮助:选取枢纽元的几种方法-数据分析方法梅长林。你将对快速排序算法有更深入的理解和掌握。
暂无评论