排序算法中的冒泡排序法
遍歷 — 樣本篩選
有的時候,樣本範圍內的數據可能不是每一個我們都需要,而是只需要其中一部分,那麽在遍歷樣本時,就需要對取出的每一個樣本數據進行判斷,看是否滿足我們的需要,也就是要對樣本進行篩選。
比如,輸出1-10之間所有的奇數,雖然樣本範圍是1-10,但不是每一個樣本數據都是我們需要的,因此,我需要對取出的每一個數據進行驗證,看它是不是奇數,如果是,才輸出。
可以使用下面的代碼來完成輸出1-10之間所有的奇數:
for (int i = 1; i <= 10; i++)
{
// 每一次進入循環體,i,就是取出的其中一個樣本數據
// 判斷該數據是不是奇數
if (i % 2 != 0)
{
Console.Write(i);// 該樣本數據滿足條件,輸出
}
}
運行結果為:
13579
遍歷 — 樣本求和
有的時候,我們需要把樣本範圍內的所有數字相加,這就是求和問題。
面對求和的問題,可以使用這樣的思路:在遍歷之前,先準備好一個變量,值為0,然後取出樣本的第一個數據,將變量的數據和第一個數據相加,然後再保存到變量中。然後對樣本剩下的數據做同樣的處理即可。
舉個例子,比如讓你對10-15之間的所有數字求和,可以使用如下的方案:
第一步:準備好一個變量,比如sum,讓它的值為0
- sum = 0;
第二步:將樣本範圍內的每一個數和變量sum中保存的值累加,然後再保存到sum中:
- sum += 10; // sum:10
- sum += 11; // sum: 21
- sum += 12; // sum: 33
- sum += 13; // sum: 46
- sum += 14; // sum: 60
- sum += 15; // sum: 75
第三步:當遍歷結束後,變量sum中的值就是累加求和的結果。
把上面的例子轉換為代碼如下:
//第一步
int sum = 0;
//第二步
for (int i = 10; i <= 15; i++)
{
sum += i;
}
//第三步
Console.Write("和為:" + sum);
輸出結果如下:
和為:75
這就是求和問題的做法,類似的累計問題也是同樣的方案,比如求10-15之間所有數的乘積,可以使用下面的代碼:
//第一步
int sum = 1; // 求乘積要從1開始
//第二步
for (int i = 10; i <= 15; i++)
{
sum *= i; // 使用累乘
}
//第三步
Console.Write("積為:" + sum);
運行結果為:
積為:3603600
遍歷 — 樣本計數
樣本計數問題往往會和樣本篩選問題合並使用。
它是指這麽一種場景,有一個樣本範圍,需要計算該樣本範圍中滿足條件的樣本數據有多少個。
比如,55-66中有多少個數能同時被2和3整除。
可以使用如下的思路解決:
第一步,準備好一個變量num,該變量表示滿足要求的樣本數據數量,一開始的值為0。
- int num = 0;
第二步,遍歷樣本,一個一個將樣本數據拿出來,看看該樣本數據是否滿足要求,如果滿足,將計數變量num自增1。
- 55 不滿足要求,什麽也不做
- 56 不滿足要求,什麽也不做
- 57 不滿足要求,什麽也不做
- 58 不滿足要求,什麽也不做
- 59 不滿足要求,什麽也不做
- 60 滿足要求,num++ // num: 1
- 61 不滿足要求,什麽也不做
- 62 不滿足要求,什麽也不做
- 63 不滿足要求,什麽也不做
- 64 不滿足要求,什麽也不做
- 65 不滿足要求,什麽也不做
- 66 滿足要求,num++ // num: 2
第三步,當遍歷結束後,變量num中的值就是計數的結果。
把上面的例子轉換為代碼如下:
//第一步
int num = 0; // num表示計數的結果,在一開始,計數之前,為0
//第二步
for (int i = 55; i <= 66; i++)
{
if (i % 2 == 0 && i % 3 == 0)
{
num++;
}
}
//第三步
Console.Write("55-66中,共有" + num + "個數能同時整除2和3");
運行結果如下:
55-66中,共有2個數能同時整除2和3
計數問題有一個經典的場景,就是判斷一個數是不是質數(素數)
什麽是質數(素數)?質數(素數)是一個大於等於2的數,該數只能被1和自身整除。
這看上去不像是一個計數場景,甚至不像是任何一個遍歷場景。
既然質數只能被1和自身整除,換句話說,在1到該數之間,一定只有兩個數能整除該數。比如,7是一個質數,因為1-7之間,只有兩個數(1和7)能整除它。
仔細理解上面這段話,如果你理解了,就會發現這是一個什麽問題?沒錯,這就是一個計數問題。
我們要判斷一個數n是不是質數,只需要看1-n之間有多少個數能整除n,如果數目為2,它就是質數,否則,它就不是。
於是,可以使用下面的代碼來判斷:
int n = 3311; // 待判斷的數n,假設它的值是3311
//下面是計數問題的代碼
//第一步
int num = 0; //計數
//第二步,遍歷範圍1-n
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
num++;//計數+1
}
}
//第三步,根據計數結果來判斷
if (num == 2)
{
Console.Write(n + "是一個質數");
}
else
{
Console.Write(n + "不是一個質數");
}
執行結果:
3311不是一個質數
排序算法中的冒泡排序法