关于快排与随机化快排

快排是我们比较熟悉的排序算法,时间复杂度最佳为O(nlogn),最坏为O(n2)随机化快排只是通过换轴将产生最坏情况可能性降低

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<time.h>
 6 using namespace std;
 7
 8 int a[1000000];
 9 int Partition(int a[],int p,int q)//随机化快排
10 {
11     int x,i,t;
12     int k=p+rand()%(q-p+1);//换轴
13     t=a[p];
14     a[p]=a[k];
15     a[k]=t;
16     x=a[p];
17     i=p;
18     for(int j=p+1;j<=q;j++)
19     {
20         if(a[j]<=x)
21         {
22             i++;
23             t=a[i];
24             a[i]=a[j];
25             a[j]=t;
26         }
27     }
28     t=a[p];
29     a[p]=a[i];
30     a[i]=t;
31     return i;
32 }
33
34 int Partition1(int a[],int p,int q)//快排
35 {
36     int x,i,t;
37     x=a[p];
38     i=p;
39     for(int j=p+1;j<=q;j++)
40     {
41         if(a[j]<=x)
42         {
43             i++;
44             t=a[i];
45             a[i]=a[j];
46             a[j]=t;
47         }
48     }
49     t=a[p];
50     a[p]=a[i];
51     a[i]=t;
52     return i;
53 }
54
55 void Quicksort(int a[],int p,int r)
56 {
57     int q;
58     if(p<r)
59     {
60         q=Partition(a,p,r);
61         Quicksort(a,p,q-1);
62         Quicksort(a,q+1,r);
63     }
64 }
65
66 int main()
67 {
68     int n,i;
69     srand(time(NULL));
70     printf("输入n:\n");
71     while(~scanf("%d",&n))
72     {
73         for(i=1;i<=n;i++)
74         {
75             a[i]=rand();
76         }
77
78         int start,end;
79         start=clock();
80         Quicksort(a,1,n);
81         end=clock();
82         for(i=0;i<n;i++)
83         printf("%d ",a[i]);
84         printf("\n");
85         printf("时间:%d\n",end-start);
86     }
87     return 0;
88 }
时间: 2024-10-14 11:38:51

关于快排与随机化快排的相关文章

数学之美番外篇:快排为什么那样快

目录 0. 前言 1. 猜数字 2. 称球 3. 排序 3.1 为什么堆排比快排慢 3.2 为什么快排其实也不是那么快 3.3 基排又为什么那么快呢 4. 信息论!信息论? 5. 小结 0. 前言 知道这个理论是在TopLanguage上的一次讨论,先是g9转了David MacKay的一篇文章,然后引发了牛人们的一场关于信息论的讨论.Anyway,正如g9很久以前在Blog里面所说的: 有时无知是福.俺看到一点新鲜的科普也能觉得造化神奇.刚才读Gerald Jay Sussman(SICP作者

[转] 快排为什么那样快

原文:数学之美番外篇:快排为什么那样快 1. 猜数字 我们先来玩一个猜数字游戏:我心里默念一个1~64之间的数,你来猜(你只能问答案是"是"或"否"的问题).为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢?很显然,二分.先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分.这种策略能够保证无论数字怎么跟你捉迷藏,都能在log_2{n}次以内猜中.用算法的术语来说就是它的下界是最好的. 我们再来回顾一下这个游戏所蕴含的本质:为什么这

2015.8.7 数学之美番外篇:快排为什么那样快 读后感

数学之美番外篇:快排为什么那样快 读后感 书中所举得例子,不论是12个小球还是排序问题,解的可能性很多,但是最终的结果只有一个.因此我需要用我所能做的操作来寻找到解空间,其中涉及关键问题:为了寻找到正确的解,我需要做什么. 首先,寻找正确的解的过程可以看做是一个逐步排除错误的解的过程.我们可以假设我的正确的解可能随机为任何一种可能,如果我的每一步能够排除掉尽可能多的解,那么我就能最快的找到我想要的解.但是我能不能使得我的每次划分都去掉一大部分呢?这是一个trade-off的问题,尽管有的时候我可

态度排第一、能力排第二、学历排第三

态度排第一.能力排第二.学历排第三 留个记录.回头补文章

哈林电子会员卡软件,升级会员微信预约排号功能,商家会员无需等待,远程预约排号,微排号系统源码

 哈林电子会员卡软件,升级会员微信预约排号功能,商家会员无需等待,远程预约排号,微排号系统源码 2015年1月4日,哈林科技旗下的电子会员卡管理软件,如期完成会员微信预约排队功能的升级,以下简称[微排队] 本软件的开发旨在给商家提供一个实用,可操作性强的电子会员卡管理平台. 微排队功能的推出主要实现以下功能: 1.商家可以在电子会员卡软件中心实时查看会员近5天内的微信预约,帮助商家合理调配人力 2.电子会员卡软件提供给商家自定义设定每个消费项目每天能服务预约的人数限制 3.商家可以通过软件合

随机化快排和决策树

1.随机化快速排序算法 (1).快速排序的坏处:完全顺序/完全逆序时时间复杂度为:O(n^2),其余的情况时间复杂度为:O(nlogn),算法的效率与输入顺序有关:   (2).随机选择主元,好处:其运行时间不依赖于输入序列的顺序,算法的效率与输入的顺序无关: (3).最差的情况由随机数产生器决定,随机化快速排序的时间复杂度为:O(nlogn): 2.比较排序的算法模型 该模型中,只能做的操作:< <= > .......,来决定元素的相对顺序: 局限性:该模型只能用于可以比较大小的数据

随机化快排

procedure qs(l,r:integer);var i,j,x,t:integer;begin    i:=l; j:=r;        x:=a[l+random(r-l)+1];    repeat        while (a[i]<x) do inc(i);        while (a[j]>x) do dec(j);        if i<=j then        begin            t:=a[i];a[i]:=a[j];a[j]:=t;  

快排,随机快排,双路快排,三路快排的理解

再讲快排之前,首先对于任何一个数组,无论之前是多么杂乱,排完之后是不是一定存在一个数作为分界点(也就是所谓的支点),在支点左边全是小于等于这个支点的,然后在这个支点右边的全是大于等于这个支点的,快排过程就是寻找这个支点过程 先看普通的快排(普通单路快排) 代码如下 let findIndex = (arr, l, len) => { let par = arr[l], j = l for (let i = l + 1; i <= len; i++) { if (arr[i] < par)

快速排序(经典快排以及随机快排)

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 首先来了解一下经典快排: 其中就小于等于的区域可以优化一下,小于的放小于区域,等于的放等于区域,大于的放大于区域.可以利用荷兰国旗问题 荷兰国旗问题: 给定一个数组arr