• 算法导论7.3快速排序的随机化版本


    以下摘自网络

    随机化快排:快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度一位前辈做出了一个精辟的总结:“随机化快速排序可以满足一个人一辈子的人品需求。”

      随机化快速排序的唯一缺点在于,一旦输入数据中有很多的相同数据,随机化的效果将直接减弱。对于极限情况,即对于n个相同的数排序,随机化快速排序的时间复杂度将毫无疑问的降低到O(n^2)。解决方法是用一种方法进行扫描,使没有交换的情况下主元保留在原位置。

    以上摘自网络

     

    1P9W]0~L(2RENY3B3IC)NY8

    %2ZH1GRE8XQY]G_{M~XCIUL

    #include <stdint.h>
    #include <iostream>
    #include <time.h>
    #ifdef __linux
    #include <stdlib.h>
    #include <stdio.h>
    #endif
    
    // RANDOMIZED-QUICKSORT(A, p, r)
    // if p < r
    //     q = PARTITION(A, p, r)
    //     RANDOMIZED-QUICKSORT(A, p, q - 1)
    //     RANDOMIZED-QUICKSORT(A, q + 1, r)
    // To sort an entire array, the initial call is RANDOMIZED-QUICKSORT(A, 1, A.length)
    
    // PARTITION(A, p, r)
    // x = A[r]
    // i = p - 1
    // for j = p to r - 1
    //     if A[j] <= x
    //         i = i + 1
    //         exchange A[i + 1] with A[r]
    // exchange a[i + 1] with A[r]
    // return i + 1
    
    // RANDOMIZED-PARTITION
    // i = RANDOM(p, r)
    // exchangeA[r] with A[i]
    // return PARTITION(A, p, r)
    
    void swap(int64_t* A, uint64_t i, uint64_t j)
    {
        int64_t tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
    
    int64_t partition(int64_t* A, int64_t p, int64_t r)
    {
        int64_t x = A[r];
        int64_t i = p;
        for (int64_t j = p; j < r; j++)
        {
            if (A[j] <= x)
            {
                swap(A, i, j);
                i++;
            }
        }
        swap(A, i, r);
        return i;
    }
    
    int64_t RandomizedPartition(int64_t* A, int64_t p, int64_t r)
    {
        int64_t i = (rand() % (r - p)) + p/* + 1*/;
        swap(A, i, r);
        return partition(A, p, r);
    }
    
    void RandomQuicksort(int64_t* A, int64_t p, int64_t r)
    {
        if (p < r)
        {
            int64_t q = RandomizedPartition(A, p, r);
            RandomQuicksort(A, p, q - 1);
            RandomQuicksort(A, q + 1, r);
        }
    }
    
    void print_array(int64_t* A, int64_t n)
    {
        std::cout << "print array" << std::endl;
        for (int64_t i = 0; i < n; i++)
        {
            std::cout << A[i] << " ";
        }
        std::cout << std::endl;
    }
    
    int main()
    {
        srand((int)time(0));
    
        int64_t array[] = { 2, 8, 7, 1, 3, 5, 6, 4 };
        print_array(array, 8);
        RandomQuicksort(array, 0, 7);
        print_array(array, 8);
        getchar();
        return 0;
    }
    

    Img7456051_nImg7456052_nImg7456053_nImg7456055_nImg7456056_n

  • 相关阅读:
    开始熟悉一下数据结构了
    首个概率dp
    十六进制转化为八进制
    蓝桥之 剪格子
    蓝桥之 颠倒的价格
    还是闲的
    也是闲的
    闲的无聊,,,
    函数进阶
    函数基础
  • 原文地址:https://www.cnblogs.com/sunyongjie1984/p/4283100.html
Copyright © 2020-2023  润新知