C#遞歸算法尋覓數組中第K年夜的數。本站提示廣大學習愛好者:(C#遞歸算法尋覓數組中第K年夜的數)文章只能為提供參考,不一定能成為您想要的結果。以下是C#遞歸算法尋覓數組中第K年夜的數正文
1.概述
國人素來愛好論資排輩的,每一個人都想當老邁,其實當不成,當個老二,老三,老K也不錯,您必定看過如許的爭辯: 兩小我打罵,一小我異常強勢,別的一個忍耐不住了便說:"你算老幾呀?",上面就經由過程這篇文章就是要處理找出老幾的成績!
2.運用場景
在向量V[first,last)中查找出第K年夜元素的值
3.剖析
假如應用排序算法將向量V排好序,那末第K年夜元素就是索引為v.length-k的元素了,如許能處理成績,但效力不高,由於這相當於為了消滅仇敵一個小隊而動用了我們三軍的力氣,得失相當,回憶疾速排序中的分表,每次都將目的向量分為兩個子表,左子表中全體小於中央元素v[mid],左邊都年夜於中央元素v[mid],如許便可以減小了查找規模,由於我可以只查找左子表或許右子表就可以找到目的元素了。以下圖所示,我們可以將向量 v劃分紅以下
Left(<=KLargest) KLargest Right(>=KLargest)
依照如許的思緒,我們仍應用疾速排序中的分表戰略,起首將向量V從中央地位離開,分紅左和右,分好後,中央值的索引假如恰好等於K,就找到了,不然假如中央元素索引年夜於K,則在左子表中持續查找,疏忽右子表,假如中央值索引小於K,則在右子表中持續查找,如斯輪回來去。
疾速排序中的子表劃分函數為:
/// <summary>
/// 交流地位
/// </summary>
/// <param name="v"></param>
/// <param name="index1"></param>
/// <param name="index2"></param>
private void Swrap(int[] v, int index1, int index2)
{
int temp = v[index1];
v[index1] = v[index2];
v[index2] = temp;
}
/// <summary>
/// 將向量V中索引{first,last)劃分紅兩個左子表和右子表
/// </summary>
/// <param name="v">向量V</param>
/// <param name="first">開端地位</param>
/// <param name="last">停止地位</param>
private int PivotIndex(int[] v, int first, int last)
{
if (last == first)
{
return last;
}
if (last - first == 1)
{
return first;
}
int mid = (first + last) / 2;
int midVal = v[mid];
//交流v[first]和v[mid]
Swrap(v, first, mid);
int scanA = first + 1;
int scanB = last - 1;
for (; ; )
{
while (scanA <= scanB && v[scanA] < midVal)
{
scanA++;
}
while (scanB > first && midVal <= v[scanB])
{
scanB--;
}
if (scanA >= scanB)
{
break;
}
Swrap(v, scanA, scanB);
scanA++;
scanB--;
}
Swrap(v, first, scanB);
return scanB;
}
設計一個函數,FindKLargest(int[] v,int first,int last,int k);這個函數包含四個參數:向量V,開端地位first,停止地位last,和第k年夜中的K,則該函數為:
挪用FindKLargest後,由於數組是從小到年夜排序,所以第K年夜元素的值為V[v.Length-k];
void FindKLargest(int[] v, int first, int last, int k)
{
//表現分表中值的索引
int index = 0;
index = PivotIndex(v, first, last);
if (index == k)
{
//找到了K年夜
return;
}
if (index > k)
{
//只在左子表中查找
FindKLargest(v, first, index, k);
}
else
{
//只在右子表中查找
FindKLargest(v, index, last, k);
}
}
4.運轉成果:
原向量 :v = { 100, 200, 50, 23, 300, 560, 789, 456, 123, 258}
first = 0; last = v.Length;k=3
輸入:456
5.結論
應用遞歸算法可以將比擬龐雜的成績劃分為愈來愈小的小成績,如許可以或許使龐雜成績簡略化,如許的思緒在體系設計和架構中異樣有著相當主要的感化,一個好的架構師,面臨龐雜的成績,能伙頭解牛般化腐敗為奇異,而壞的卻常常拔苗助長,他們的專長是簡略成績龐雜化。
6.項目文件
http://xiazai.jb51.net/201606/yuanma/FindK(jb51.net).rar