演算法導論中的順序統計學示範程式碼
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
namespace select {
/**
* 使用快速排序的思想完成選擇
**/
int divide(vector<int>& in, int beg, int end, int pivot) {
if (beg >= end) return -1;
int b = beg, e = end - 1;
while (b < e) {
while (b < e && in[e] >= pivot) e--;
while(b < e && in[b] < pivot) b++;
swap(in[b], in[e]);
}
return b;
}
int quick_select(vector<int>& in, int k) {
int beg = 0, end = in.size();
while (k >= 0 && beg < end) {
int mid = divide(in, beg, end, in[beg]);
if (mid - beg == k) return in[mid];
else if (mid - beg < k) {
k -= (mid - beg + 1);//思維惰性,導致的錯誤,懶害死人的,細節決定成敗
beg = mid + 1;
} else {
end = mid;
}
}
return 0;
}
/**
* 使用分組中位數的思想完成選擇
**/
void insert_sert_seg(vector<int>& in, int beg, int end) {
for (int i = beg + 1; i < end; ++i) {
int tmp = in[i];
int j = i - 1;
while(j >= 0 && in[j] > tmp) {
in[j + 1] = in[j];
j--;
}
in[j + 1] = tmp;
}
}
int on_select(vector<int>& in, int k, int beg, int end) {
if (beg + 1 == end) return in[beg];
vector<int> tmp;
for (int i = beg; i < end; i += 5) {
int b = i * 5;
int e = min((i + 1) * 5, end);
insert_sert_seg(in, b, e);
tmp.push_back(in[(b + e) / 2]);
}
int mid_val = on_select(tmp, tmp.size() / 2, 0, (int)tmp.size());
int mid = divide(in, beg, end, mid_val);
if (mid - beg == k) return in[mid];
else if (mid - beg < k) {
k -= (mid - beg + 1);//思維惰性,導致的錯誤,懶害死人的,細節決定成敗
beg = mid + 1;
} else {
end = mid;
}
return on_select(in, k, beg, end);
}
int lineartime_select(vector<int>& in, int k) {
k = k % (int) in.size();
return on_select(in, k, 0, (int)in.size());
}
};
int main() {
vector<int> data;
int k;
int n;
cin>>n;
for (int i = 1; i <= n; ++i) {
int tmp;
cin>>tmp;
data.push_back(tmp);
}
cin>>k;
//int ret = select::quick_select(data, k);
int ret = select::lineartime_select(data, k);
cout<<ret<<endl;
return 0;
}
相關推薦
演算法導論中的順序統計學示範程式碼
#include<iostream> #include<vector> #include<algorithm> using namespace std; namespace select { /** * 使用快速排序的思想完
演算法導論中紅黑樹插入演算法的C+實現及優化改進
之前在上到算導的紅黑樹插入時,突然冒出個想法,下課的時候找徐教授交流,由於當時也沒想透徹加上表述不清,就沒深入下去。恰巧實驗課要做紅黑樹插入的實現,於是整理了一番,記錄於此以備以後檢視。 由於C++水平太菜,程式碼基本用C實現,用到了一些C++的新特性。 首先是結點的資料
Java實現演算法導論中圖的廣度優先搜尋(BFS)和深度優先搜尋(DFS)
對演算法導論中圖的廣度優先搜尋(BFS)和深度優先搜尋(DFS)用Java實現其中的虛擬碼演算法,案例也採用演算法導論中的圖。 import java.util.ArrayList; import java.util.HashMap; import java.util.It
Java實現演算法導論中樸素字串匹配演算法
樸素字串匹配演算法沿著主串滑動子串來迴圈匹配,演算法時間效能是O((n-m+1)m),n是主串長度,m是字串長度,結合演算法導論中來理解,具體程式碼參考: package cn.ansj; publ
演算法導論中的演算法總結
1、插入排序 INSERTION_SORT(A) for j = 2 to A.length key = A[j] i = j-1 while i > 0 and A[i] > key A[i+1] = A[i] i = i-1 A[i+1] =
用Python實現演算法導論中的演算法 序
目前正好在學習Python和《演算法導論(原書第三版)》,於是想著想用Python把書中所有演算法實現一遍。更新時間不確定,完成時間我也沒有定下來,大概有空就會寫寫,希望儘早可以完成吧~ 本篇部落格將
Java實現演算法導論中最長公共子序列(LCS)動態規劃法
1、問題: 求兩字元序列的最長公共字元子序列LCS 2、求解:動態規劃法 動態規劃的思路就是用一個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1序列,其對應的位置就是最長匹配子
演算法導論--動態順序統計與區間樹
通過在基礎的資料結構中新增一些附加資訊,來擴張一種標準的資料結構,然後編寫新的操作來支援所需要的應用。下面是介紹在紅黑樹的基礎上擴張的資料結構。 1.動態順序統計 動態順序統計可以在O(lgn)時間內確定任何的順序統計量(即在n個元素的集合中,能在O
【演算法導論】9.中位數和順序統計量
在一個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。一箇中位數是它所屬集合的“中點元素”。中位數總是出現在上中位數處和下中位數處,本書中所用的“中位數”都是指下中位數。 本章討論的問題是,從一個由n個互異的元素構成的集合中選擇第i個順序統計量的問題,假設集合中的元素都是互異的。
中位數和順序統計量---演算法導論學習筆記
演算法導論斷斷續續看了一小部分,但是還沒有寫過總結和筆記,很多思考和學習到的東西都隨著時間流失掉了(痛心)。 下面進入正題: 1.最大值和最小值問題 最簡單的確定一個有n個元素的集合中最小元素(最大元素)的方
《演算法導論》中BTree的程式碼實現~
BTree.h #ifndef _BTREE_H #define _BTREE_H #define MINDEGREE 3 // 定義BTree的最小度 #define MAXDEGREE (MINDEGREE*2) // 定義BTree的資料結構 typedef
演算法導論 學習筆記 第九章 中值和順序統計
本章其實只講了一個問題,那就是如何從一個數組當中用線性時間內找出第i個小的元素。 最小值和最大值 這個就比較簡單了,直接挨個比,執行時間就是線性的,而且這就是最好的辦法。 如何同時找出最小值和最大值咧? 這個其實也簡單,那就記錄兩個資料唄。執行時間是找
讀書筆記 -- 算法導論(第二部分 排序和順序統計學)
每一個 運行時間 每次 有時 時間 直接 表示 基礎上 通過 輸入數據的結構 在實際中,待排序的數很少是孤立的值,它們通常是一個稱為記錄的數據集的一部分。每個記錄有一個關鍵字key,它是待排序的值。記錄的其他數據稱為衛星數據,即它們通常以key為中心傳送。在一個排序的
演算法導論 第六章:堆排序 筆記(堆、維護堆的性質、建堆、堆排序演算法、優先順序佇列、堆排序的程式碼實現)
堆排序(heapsort) 像合併排序而不像插入順序,堆排序的執行時間為O(nlgn) 。像插入排序而不像合併排序,它是一種原地( in place) 排序演算法:在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。 堆: (二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹
Python實現 《演算法導論 第三版》中的演算法 第2章 演算法基礎
第2章 演算法基礎 1. 插入排序 P17。插入排序比較簡單。 class InsertionSort: def sort(self, A): for i in range(
《演算法導論》中演算法的部分實現[GitHub]
Introduction to Algorithms 介紹 GitHub地址 閱讀《演算法導論》過程中實現的部分演算法(Java版)。 已實現的演算法(後續持續更新。。。) chapter 2 插入排序 歸併排序 cha
測試引入的js檔案,和直接在頁面中寫的js程式碼執行的順序,順便還有個疑問(即JavaScript中變數宣告有var和沒var的區別)
測試引入的js檔案,和直接在頁面中寫的js程式碼執行的順序,順便還有個疑問(即JavaScript中變數宣告有var和沒var的區別),有時間再倒回來理解這個問題 <!DOCTYPE html> <html> <head> <meta charset
Python實現 《演算法導論 第三版》中的演算法 第6章 堆排序
第6章 堆排序 1. 堆 堆是一個數組,它可以被看成一個近似的完全二叉樹。樹上的每一個結點對應陣列中的一個元素。除最底層外,該樹是完全充滿的,而且是從左向右填充。表示堆的陣列包括兩個屬性:A.le
Java中構造方法,程式碼塊,靜態塊的執行順序
class A{ public A(){ System.out.println("class A");//父類構造方法 } { System.out.println("I am A class ");//父類構造塊
演算法導論 第一章:演算法在計算中的作用 筆記
文章目錄 演算法 NP完全問題 插入排序和合並排序 演算法 演算法(algorithm) 就是定義良好的計算過程,它取一個或一組值作為輸入, 併產生出一個或一組值作為輸出。也就是說,演算法就是一系列的計算步驟,用來將輸入資料轉換成輸