【算法导论】第i小的元素
第i小的元素
时间复杂度:O(n).
基本思想:和快速排序的思想相似,也是对数组进行递归划分,但是有所差别的是,快速排序会递归处理划分的两边,而随机化的选择算法只选择一边。
具体步骤为:首先,随机选择一个数组元素作为主元,从而将数组分解为两个子数组,并得到主元在元素中的位置q,假设较小子数组元素的个数为k-1;然后比较i与k的大小,来确定下一次递归选择哪一边的子数组(注意i的值的改变情况);最后,当i==k时,就求得了第i小的元素。具体实例见图解:
具体的程序实现如下:
#include<stdio.h> #include<stdlib.h> #include<time.h> int Partition(int*arrayA,int n,int p,int r); int RandomPartition(int* arrayA,int n,int p,int r); int RandomSelect(int* arrayA,int n,int p,int r,int i); void main() { int arrayA[8]={2,1,3,4,8,6,7,5}; int n=sizeof(arrayA)/sizeof(int); int p=0; int r=7; int i=4; int result=0; result=RandomSelect(arrayA,n,p,r,i); printf("数组中第%d小的数是%d\n",i,result); } /**************************************************\ 函数功能:将原数组分成全大于和全小于x的两个子数组 输入:原始数组、要对数组进行操作的起始和结束下标p、r 即只对数组指定部分进行操作。 输出:x在数组中的位置 \**************************************************/ int Partition(int*arrayA,int n,int p,int r) { int x=arrayA[r];//使主元x选为数组选中部分的最后一个元素 int i=p-1; int temp=0; for(int j=p;j<=r-1;j++) { if(arrayA[j]<=x) { i++; temp=arrayA[i]; arrayA[i]=arrayA[j]; arrayA[j]=temp; } } temp=arrayA[i+1]; arrayA[i+1]=arrayA[r]; arrayA[r]=temp; return i+1;//最终主元的位置 } /**************************************************\ 函数功能:用随机数确定主元 输入:原始数组、要对数组进行操作的起始和结束下标p、r 即只对数组指定部分进行操作 输出:x在数组中的位置 \**************************************************/ int RandomPartition(int* arrayA,int n,int p,int r) { int suiji=0; srand(time(0)); suiji=rand()%(r-p)+p;//产生大于等于p,小于r的随机数 printf("suiji=%d\n",suiji); int temp=0; temp=arrayA[r]; //使主元由随机数确定 arrayA[r]=arrayA[suiji]; arrayA[suiji]=temp; return Partition(arrayA,n,p,r); } /**************************************************\ 函数功能:找出数组中第i小的数 输入:原始数组、要对数组进行操作的起始和结束下标p、r 即只对数组指定部分进行操作 输出:x在数组中的位置 \**************************************************/ int RandomSelect(int* arrayA,int n,int p,int r,int i) { int q=0; if(p==r) return arrayA[p]; for(int j=p;j<=r;j++) printf("%d ",arrayA[j]); printf("\n"); q=RandomPartition(arrayA,n,p,r);//主元的位置 printf("gaihou:\n"); for(int j=p;j<=r;j++) printf("%d ",arrayA[j]); printf("\n\n"); int k=q-p+1; if(i==k) return arrayA[q]; else if(i<k) return RandomSelect(arrayA,n,p,q-1,i); else return RandomSelect(arrayA,n,q+1,r,i-k); }
注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:
#include<stdio.h>
void main()
{
int i=0;
for(int i=0;i<5;i++)
printf("%d ",i);
}
则在VC 6.0上需改为:
#include<stdio.h>
void main()
{
int i=0;
for(i=0;i<5;i++)
printf("%d ",i);
}
原文:http://blog.csdn.net/tengweitw/article/details/9668849
作者:nineheadedbird
【算法导论】第i小的元素的更多相关文章
- 算法导论-顺序统计-快速求第i小的元素
目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计 ...
- 《算法导论》——重复元素的随机化快排Optimization For RandomizedQuickSort
昨天讨论的随机化快排对有重复元素的数组会陷入无限循环.今天带来对其的优化,使其支持重复元素. 只需修改partition函数即可: int partition(int *numArray,int he ...
- C++算法导论第九章O(n)期望选择序列第i小的数字
#include<iostream> #include<vector> #include<algorithm> #include<time.h> usi ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 算法导论第十八章 B树
一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...
- 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机
对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
- MIT算法导论——第五讲.Linear Time Sort
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
随机推荐
- jquery 数组操作 $.unique() $.inArray()
1.去除重复 $.unique() $.unique() 去掉重复的元素 注意 : 执行unique之前,要先调用sort对数组的内容进行排序. <script src="http:/ ...
- Elasticsearch 学习(二):安装和使用
一.安装 安装 Elasticsearch 之前,需要先安装 Java,并配置好 Java 环境变量. 安装好 Java 环境后,进入 Elasticsearch 官网下载安装包. 解压安装包,进入解 ...
- js前端模块化(一) commonjs
随着浏览器的发展,很多页面逻辑迁移到了客户端(表单验证等),JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,JavaScript极其简单的代码组 ...
- jquery form提交
$('#form').form("submit", { url: "Stu_sendsms.aspx", onSubmit: function () { $(' ...
- Switch控件详解
Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...
- 【SSH系列】一步步深入springmvc+商品列表查询demo
在前面的博文中,小编主要简单的介绍springmvc的体系结构.mvc模式的优缺点以及mvc框架,今天我们来继续学习springmvc的相关知识,在这篇博文中,小编讲解过springmvc的体系结构, ...
- Swift3中方法可变参数语法的一些改变
我们知道在Swift2中,默认情况下方法的参数是let值,也就是不可改变的. 不过我们可以在参数前添加var关键字改变其不变性: func foo(var i:Int){ i += 1 print(i ...
- 23 服务的启动Demo2
MainActivity.java package com.qf.day23_service_demo2; import android.app.Activity; import android.co ...
- Java异常处理-----自行处理
自行处理 1.try{//可能发生异常的代码 }catch(异常类 变量名){//处理}. 2.案例除法运算的异常处理. 3.如果没有进行try catch处理,出现异常程序就停止.进行处理后,程序会 ...
- Scikit-learn:模型评估Model evaluation
http://blog.csdn.net/pipisorry/article/details/52250760 模型评估Model evaluation: quantifying the qualit ...