2012 4 4 隨機選擇法

2021-09-01 04:58:03 字數 1445 閱讀 3871

寫演算法之前先吐槽一下,今天實在是不適合騎車。昨晚花了乙個小時洗車,準備乾糧,各種騎行裝備全都檢查一遍就為今天的騎行。早上6點起床,7點準時集合出發,但是出發後就開始下雨。結果我們冒雨騎了近40km,不僅全身濕透(沒有擋泥板的車,雨天真的不想再騎了),還滿背是泥。並且由於雨越下越大,路又滑導致騎行速度提不上去,全程140km已經不能順利完成了,只有半途返回。

但是悲劇的事情又發生了,在返回的途中一朋友的車胎爆了,大家又在雨中花了近1個小時補胎(主要是車胎不好補,一次性爆了兩個大洞,無奈)。回來之後照鏡子看了一下,全身是泥,昨晚剛洗的車已經看不出車樣了,於是又花了20分鐘洗車。。。

好了,吐槽結束,開始寫演算法了。

隨機選擇法(randomized-select):選擇出陣列a經過排序後的第i個數(有乙個專業名詞需要了解--順序統計量),常規方式是先對陣列a進行排序,然後再取出a[i]的值就可以了。但是,使用先排序再選取這種方式,它的時間效率不太好。所以,這裡我們使用「隨機選擇法」。其核心思想有點像快速排序,先找乙個關鍵字key檢視其所在陣列中的位置q,然後再比較q和i的大小,如果i=q,則我們直接就可以取出關鍵字key;如果i>q,則我們又在[q+1...]這個範圍內選擇關鍵字進行比較,直到找到i=q為止;如果i至於詳細的思想,程式中有足夠的注釋幫助理解。

/*

* 隨機選擇法求陣列中的」順序統計量「----即在排序後的陣列中,a[i]的值

* @version 1.0 2012/4/4

* @author akon

*/package com.akon405.www;

public class randomizedselect

int q=division(a,left,right);//q為分割點的下標(陣列a以key值為界限,分為兩撥。key前面的數值比key小,key後面的數值比key大)

if(i==q)else if(ia[left])

left++;//從左向右找出比key大的第乙個數值,下標為left

temp=a[right];

a[right]=a[left];

a[left]=temp;

} return left;//分割點的下標,left=right

} /**

* @param args

*/public static void main(string args) ;

randomizedselect rs=new randomizedselect();

int right=a.length-1;//陣列的右邊

int left=0;//陣列的左邊

int i=6;//第i個」順序統計量「--即在排序後的陣列中,a[i]的值

if(i<=right)

system.out.print(rs.randomized_select(a, left, right, i));//輸出這個所求的資料

}}

排序 選擇法

選擇法 基本思想,每一趟 例如第 i 趟,i 0,1,n 2 在後面 n i個待排的資料元素中選出關鍵字 最小的元素,作為有序元素序列的第 i 個元素。排序過程 首先通過n 1次關鍵字比較,從n個記錄中找出關鍵字最小的記錄,將它與第乙個記錄交換 再通過n 2次比較,從剩餘的n 1個記錄中找出關鍵字次...

選擇法排序

usr bin python coding utf 8 defselect sort li num 選擇法排序 foriin range num 1 對位置進行遍歷 min i 把i位置記做最小值 forjin range i 1,num 查詢i之後的所有位置的最小值 ifli i li j 如果找...

冒泡法和選擇法

程式的版權和版本宣告部分 檔名稱 fibnacci.cpp 作 者 單虹毓 完成日期 2013 年 12 月 5 日 版本號 v1.0 輸入描述 無 問題描述 冒泡和選擇法 程式輸出 程式輸出 問題分析 include using namespace std void sortascmaopao i...