三、快速排序的随机化版本以下是完整测试程序,由于给的注释够详尽了,就再做多余的解释了:


//交换两个元素值,咱们换一种方式,采取引用“&”

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]);

}

快速排序算法中的随机化版本显然增加了算法的趣味性和不确定性。然而,如果你想进一步了解数据分析中使用的这些方法,可以查看《数据分析方法梅长林》,该书提供了详尽的说明和示例。详细信息请参考:数据分析方法梅长林

关于快速排序的多种实现方式以及其随机化版本的深入比较,推荐阅读这篇文章:快速排序的三种写法及随机化快速排序。你会发现,随机化快速排序不仅仅是简单的理论,在实际应用中,它的优势也是显而易见的。

如果你对如何选择枢纽元感兴趣,这篇文章会对你大有帮助:选取枢纽元的几种方法-数据分析方法梅长林。你将对快速排序算法有更深入的理解和掌握。