學過排序演算法的應該知道選擇排序是指從陣列中找出最大的值放在相應的位置。一般需要兩重迴圈來實現,外重迴圈確定待排序的序列,內重迴圈則找出待排序序列中的最大值,出迴圈時將該值與外重迴圈所指定的下表做乙個交換(swap)。
不知道聰明的你有沒有思考過,這個過程有乙個遞迴的意思暗藏在裡面。定義遞迴函式select,引數指定最大值待放入的位置start。
首先找出序列中的最大值,這裡可由乙個函式模組單獨實現
將待放入的位置(由引數start指定)的值與最大值做乙個交換
遞迴計算指定最大值為start+1的陣列的select方法。
遞迴出口為start超出了陣列長度(注意不是越界哈)
相信讀者您一定恍然大悟。不過,這個方式其實只是對選擇排序的改寫,而非改進,時間複雜度仍然是o(n^2)。證明如下:
由演算法可知:
o(n)=n(找最大值所花的時間)+o(n-1)(剩下select的遞迴所花的時間);..
o(2)=2+1;
o(1)=1;
所以數學歸納法證得時間複雜度為o(n^2)。
具體**實現如下:
#include
#include
"func.h"
using
namespace std;
intmax
(int a,
int start,
int length)
}return locate;
}void
swap
(int
&a,int
&b)void
selectsort
(int a,
int start,
int length)
}void
print
(int a,
int length)
intmain()
;selectsort
(a,0,10
);print
(a,10);
return0;
}
void
selectsort
(int a,
int start,
int length)
;int
max(
int a,
int start,
int length)
;void
print
(int a,
int lengh)
;void
swap
(int
&a,int
&b);
執行結果如下:
關於對傅利葉變換的一些理解
近日以來,由於學習影象處理,感覺其對傅利葉變換等內容要求較高,故重整旗鼓又過了一遍訊號系統等章節,做了不少實驗,有所感悟,特記錄下,以便備忘!首先,對於傅利葉變換,最為需要理解的便是傅利葉級數,個人感覺這個是後邊最為基礎也是最為重要的部分,對於連續傅利葉級數有 從傅利葉級數的定義可以很明顯看出,對於...
個人對氣泡排序的一些理解
氣泡排序 將乙個無序陣列進行排序 例 規則 從第乙個數開始,第乙個數和後面的數進行比較,小的放前面,大的放後面。直到最後兩個數進行比較後,算一輪排序。因為每一輪會確定乙個數的位置,因此總輪數正好是陣列長度 1。考慮使用內外層for迴圈,外層控制氣泡排序的輪數,內層迴圈對數進行兩兩比較。使用if條件語...
對Linux inode的一些理解
檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...