演算法導論_第九章_中位數和順序統計量
演算法導論_第九章_中位數和順序統計量
最小值和最大值
在一個有n個元素的集合中,至少要n-1次比較才能找到最小值或最大值。
如果同時找最大值和最小值,只需要3*(n/2)次比較,因為對於兩個數,首先對這兩個數
進行比較,較大的一個與最大值比較,較小的一個與最小值比較,這樣就找到了最大最
小值。
期望為線性的選擇演算法
利用快排中的分治思想找到第i大的數字
下面上程式碼:
/*************************************************************************
> File Name: randomized_select.cpp
> Author:chudongfang
> Mail:1149669942@qq.com
> Created Time: 2016年06月29日 星期三 16時17分58秒
************************************************************************/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int randomized_select(int A[],int p,int r,int i);
int randomized_partition(int A[],int p,int r);
void swap(int *x,int *y){int t; t=*x; *x=*y; *y=t; }
int main(int argc,char *argv[])
{
int A[100];
int n,m;
printf("please input the number of array:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
printf("please input the number you want get:");
scanf("%d",&m);
printf("%d",randomized_select(A,1,n,m));
return 0;
}
int randomized_select(int A[],int p,int r,int i)
{
if(p==r)//如果只剩一個元素,直接返回
return A[p];
int q=randomized_partition(A,p,r);//分割
int k=q-p+1;//分割左邊的長度
if(i==k) //如果正好為第i大的元素,返回
return A[q];
else if(i<k)//如果其比i大,在左邊陣列中找
return randomized_select(A,p,q-1,i);
else
return randomized_select(A,q+1,r,i-k);//如果其比i小,在右邊陣列中找
}
int randomized_partition(int A[],int p,int r)
{
int y=p+rand()%(r+1-p);//隨機交換A[r]
swap(A+y,A+r);
int x=A[r];//以這個元素為主元,即拿這個元素與其他元素比較
int i=p-1;//i為最左邊元素減一
//其中,從p到i為小於等於x的子陣列1,而從i+1到j為大於等於x的子陣列2,
//從j+1到r-1表示的是還未進行分配的子陣列
//而元素r為主元
for(int j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i++;//子陣列1加入一個元素
//加一後的i大於等於x
swap(A+i,A+j);
//交換後其恢復原來“秩序”
}
}
swap(A+i+1,A+r);//把主元放到合適的位置。
return i+1;//返回主元的位置
}
經分析,其時間為線性的,為O(n)
最壞情況為線性時間的演算法SELECT
1.將輸入陣列的n個元素劃分為[n/5]組,每組5個元素,且至多隻有一組由剩下nmod 5組
成
2.插入排序尋找中位數
3.對2中找出的中位數遞迴呼叫SELECT,找出其中的中位數
4.按3找出的中位數進行劃分
5.如果i==k返回,i<k在低位區間遞迴呼叫SELECT i>k在高位區間遞迴呼叫SELECT
其時間複雜度
T(n)=T(n/5)+T(7*n/10+6)+O(n)
其中T(7*n/10+6)是因為步驟5中的最多要在7*n/10+6個數中進行查詢
經計算,其時間複雜度為:
O(n)
相關文章
- 演算法導論-中位數和順序統計量演算法
- 漏洞優先順序技術(VPT)導論
- JS演算法——統計字元數量JS演算法字元
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- 分散式系統理論基礎 - 時間、時鐘和事件順序分散式事件
- arcgis欄位值計算(擷取A欄位前8位+按照順序計算8位)
- udev控制磁碟引導順序dev
- 演算法設計與分析---論序演算法
- 《系統化思維導論》譯者序
- HttpClient和HttpGet 引數的優先順序HTTPclient
- 分散式系統理論基礎3: 時間、時鐘和事件順序分散式事件
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列
- 演算法題———————輸入棧的入棧順序和出棧順序判斷是否合理演算法
- js中同名變數或者引數的優先順序JS變數
- 演算法學習之路|個位數統計演算法
- 繼承中引數傳遞及呼叫順序繼承
- 演算法導論第三十一(31)章數論演算法演算法
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- 靜態順序表和動態順序表 對比
- 列定義的順序和列儲存的順序
- 【基礎題】【順序】個位、十位、百位、千位
- oracle更改欄位名順序的方法Oracle
- Oracle group by與case when統一單位後統計數量Oracle
- 中斷優先順序
- Python - 物件導向程式設計 - MRO 方法搜尋順序Python物件程式設計
- 如何計算FMEA的風險順序數(RPN)
- JZ-013-調整陣列順序使奇數位於偶數前面陣列
- 計量經濟學導論10:ARIMA模型模型
- 演算法導論 3.2-7 共軛數演算法
- 調整陣列順序使奇數位於偶數前面,偶數和偶數之間的相對位置不變陣列
- 《演算法導論》演算法
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 欄位按照指定 ID 順序進行排序排序
- 雲伺服器修改Linux系統核心的引導順序伺服器Linux
- 淺談Java類中的變數初始化順序Java變數
- 劍指 Offer 21. 調整陣列順序使奇數位於偶數前面陣列
- 【位操作筆記】位計數演算法 分治法統計 4 另外一個版本筆記演算法
- JAVA中取順序號 (轉)Java