快速排序的随机化版本

#include<iostream>
#include<ctime>
using namespace std;
void swap(int*a, int *b)
{
    int *c = a;
    a = b;
    b = c;
}
int Partition(int *A, int p, int r)
{
    int x = A[r];
    int i = p - 1;
    for (int j = p; j < r; j++)
    {
        if (A[j] < x)
        {
            i++;
            swap(A[i],A[j]);
        }
    }
    swap(A[i+1],A[r]);
    return (i+1);
}
int Random(int M, int N)
{
    return (int)((double)rand() / (double)RAND_MAX*(N - M + 1) + M);
}
int Random_Partition(int *A, int p, int r)
{
    int i = Random(p,r);
    swap(A[r],A[i]);
    return Partition(A, p, r);
}
void QuickSort(int *A, int p, int r)
{
    if (p < r)
    {
        int q = Random_Partition(A, p, r);
        QuickSort(A, p, q - 1);
        QuickSort(A,q+1,r);
    }
}
int main()
{
    int A[] = {2,8,7,1,3,5,6,4};
    int N = sizeof A / sizeof A[0];
    srand((int)time(0));//必须放在调用前,不可放到产生随机数的函数中
    QuickSort(A, 0, N-1);
    for (int i = 0; i < N; i++)
        cout << A[i] << "  ";
    cout << "\n";
    return 0;

}
时间: 2024-10-13 09:29:25

快速排序的随机化版本的相关文章

排序算法之快速排序的随机化版本

4.3 快速排序的随机化版本 这种方法并不是一种全新的排序算法,而是在快速排序的基础上加入随机化的因素,因素,因而仍然将其作为第四种方法(快速排序)的一种补充. 为什么要提出快速排序的随机化版本,主要是对于快速排序法其划分情况的好坏会直接影响排序的效率,而且,快速排序的平均性能较好,所以,加入随机化成分,可以使该算法对于所有输入均能获得较好的平均情况性能. 针对加入随机化的环节,选取的是选取主元的环节,因为主元的选取直接影响快速排序算法的数组划分. C代码实现为: #include <stdio

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

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

复习数据结构:排序算法(五)——快速排序的各种版本

之前已经比较熟悉快排的基本思想了,其实现的方式也有很多种.下面我们罗列一些常见的实现方式: 版本一:算法导论上的单向扫描,选取最后一个元素作为主元 #include<iostream> using namespace std; int partition(int data[], int low, int high) { int pivot = data[high]; // let the last atom be the pivot int i = low - 1; // mark the p

快速排序(js版本)

快速排序的时间复杂度为:O(n*log2n),相比较其他O(n2)的排序算法,还是比较有优势的.原文参考在此处,因为本人对原文的一小段代码有点不理解,所以进行了小的修改. 1.基本思想:在数组的第一个或最后一个元素里选择一个,作为基准元素,也称中轴.通过排序,让中轴把数组分为俩部分,一部分比中轴小,一部分大.再用递归法同样的排序俩部分. 2.实例: 3.js代码 var arrayQuick = [7,9,4,8,2,24,54,12,32,11,2]; quick(arrayQuick,0,a

算法导论-排序(二)快速排序、随机化快速排序

目录 1.本文介绍 2.快速排序 3.随机化快速排序 4.完整源码 5.参考资料 内容 1.本文介绍 主要内容分为两部分,一部分是介绍快速排序算法,分析其在最好.最坏以及最好最差交替出现情况下的算法效率:另一部分则是介绍随机化快排算法,以及分析其算法复杂度.最后给出c++实现代码. 2.快速排序 快速排序也是基于分治思想,首先把要排序的数组分为两份,然后再分别对分好的子数组进行快速排序.当子数组为1个元素时递归介绍,排序完成.快速排序属于“原地排序”,就是说在原有的数组内存上排序.不占用其他内存

快速排序的随机化算法

快速排序在最坏情况下的复杂度较高,采取随机化算法选择每次的分割点,能够在一定程度上使每次划分的平衡性更好. // // main.cpp // eoj1807 // // Created by Fangpin on 15/3/15. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdlib> #include <cstdio> #includ

快速排序(javascript版本)

基本过程 1. 选取数组中的一个元素作为基准(pivot) 2. 按照基准将数组分区,左区全部小于基准,右区全部大于基准,使用方法为原地置换(swap in place) 3. 对左右分区递归使用1和2步,直至左右分区只有一个或零个元素,排序完成 JavaScript实现 function fQuickSort(arr,low,high) { if(low >= high){ throw new Error('low should less than high'); } var pivotInd

快速排序的partition版本实现

int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low-1; for (int j = low; j < high; j++) { if(arr[j] <= pivot) { i++; swap(arr[i], arr[j]); } } swap(arr[i+1],arr[high]); return i+1; } void quickSort(int arr[], int low, in

【算法导论】学习笔记——第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为theta(n^2)的排序算法.虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好,期望时间复杂度是theta(nlgn),而且常数因子非常小,并可进行原址排序.1. 快速排序的描述快速排序可采用分治思想实现.分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1.