快速排序的随机化算法

快速排序在最坏情况下的复杂度较高,采取随机化算法选择每次的分割点,能够在一定程度上使每次划分的平衡性更好。

//
//  main.cpp
//  eoj1807
//
//  Created by Fangpin on 15/3/15.
//  Copyright (c) 2015年 FangPin. All rights reserved.
//

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
using namespace std;
int a[20005];
void quick_sort(int l,int r){
    if(l>=r) return ;
    int x=rand()%(r-l+1)+l;//随机选取划分参考点
    swap(a[r],a[x]);
    int i=l-1;
    for(int j=l;j<=r-1;++j){
        if(a[j]<=a[r]){
            ++i;
            swap(a[i],a[j]);
        }
    }
    swap(a[i+1],a[r]);
    quick_sort(l,i);
    quick_sort(i+2,r);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    srand((int)time(NULL));
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i)
        scanf("%d",&a[i]);
    quick_sort(0,n-1);
    for(int i=0;i<n;++i){
        if(i!=n-1) printf("%d ",a[i]);
        else printf("%d\n",a[i]);
    }
    return 0;
}
时间: 2024-11-08 15:16:09

快速排序的随机化算法的相关文章

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

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

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

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

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

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

[ACM] POJ 3318 Matrix Multiplication (随机化算法)

Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16118   Accepted: 3485 Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a posit

POJ 3318 Matrix Multiplication(随机化算法)

给你三个矩阵A,B,C.让你判断A*B是否等于C. 随机一组数据,然后判断乘以A,B之后是否与乘C之后相等. 很扯淡的啊,感觉这种算法不严谨啊... Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16255   Accepted: 3515 Description You are given three n × n matrices A, B and C. Does the e

PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)

题目大意:原题链接 给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大. 标记:A集合:true  B集合:false 解法一:dfs+剪枝 #include<iostream> #include<cstring> using namespace std; int n,ans; bool in[25]; int graph[25][25]; void dfs(int i

POJ3318--Matrix Multiplication 随机化算法

Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a positive integer n (n ≤ 500) followed by the the three matrices A, B and C respectively. Each matrix's descript

快速排序实现代码 算法导论7.1 7.2 7.4

快速排序通常是实际排序中应用最好的选择,因为平均性能很好,且是原址排序,不稳定. 书上的大部分内容在分析其运行时间,感觉看一下就好了(还是蛮喜欢数学的,可是...) #include <iostream> #include <algorithm> #include <random> using namespace std; //实际应用比较多,原址排序 typedef int index; index Partition(int *a, index p, index r

Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序算法详解

http://baozoumanhua.com/users/10873617/articleshttp://baozoumanhua.com/users/10873639/articleshttp://baozoumanhua.com/users/10873665/articleshttp://baozoumanhua.com/users/10873687/articleshttp://baozoumanhua.com/users/10873718/articleshttp://baozouma