[1] 演算法之路,演算法之路
選擇排序 – 演算法
1. 將要排序的對象分作2部份,一個是已排序的,一個是未排序的
2. 從後端未排序部份選擇一個最小值,並放入前端已排序部份的最後一個
e.g:
排序前:70 80 31 37 10 1 48 60 33 80
[1] 80 31 37 10 7048 60 33 80 選出最小值1
[1 10] 31 37 80 7048 60 33 80 選出最小值10
[1 10 31] 37 80 7048 60 33 80 選出最小值31
[1 10 31 33] 80 7048 60 37 80 ......
[1 10 31 33 37] 7048 60 80 80 ......
[1 10 31 33 37 48]70 60 80 80 ......
[1 10 31 33 37 4860] 70 80 80 ......
[1 10 31 33 37 4860 70] 80 80 ......
[1 10 31 33 37 4860 70 80] 80 ......
#define SWAPER(X,Y){int t;t=X;X=Y;Y=t;}選擇排序 – 程式片段:int SelectionSort(int a[],int lens){int i,j,k;for(i=0;i<lens;i++){int minIndex = i;for(j=i+1;j<lens;j++){if(a[minIndex]>a[j]){minIndex=j;}}if(i!=minIndex) SWAPER(a[i],a[minIndex]);}return 0;}int SelectionSort2(int a[],int lens){int i,j,k;for(i=0;i<lens;i++){for(j=i+1;j<lens;j++){if(a[i]<a[j]){SWAPER(a[i],a[j]);}}}return 0;}
本科畢業怎走上演算法之路? 興趣使然,但不知路在何方 經驗人指點一二 謝過
兩點基礎,一是程式設計語言,二是編程技術。
演算法有很多,隨便拿本演算法書來,上面的論題一輩子也學不完。
找個感興趣的課題,最好是結合實際的,前人已經做了部分工作的,繼續研究下去。
短期內不求回報的話,可以把輪子再造一遍。
一個最優路徑演算法的思路
同意樓上,最長路徑是NPC問題,不存在多項式演算法。
證明是簡單的:
1、最長無環路問題的判定版本是“給定有向圖D和整數k,問D中是否存在長度大於或等於k的無環路”(這一表述對有權圖和無權圖都有效)。
2、將Hamilton路問題規約到最長無環路問題(的判定版本)是顯然的:輸入一個n頂點的有向圖D,直接問:有向圖D中是否存在長度大於等於n-1的無環路?
簡言之,對任意n頂點的有向圖D,假如能夠D中的找到最長無環路P,那麼就能立即知道D中是否存在Hamilton路(只需看P的長度是否為n-1即可),從而最長無環路問題是NPC。
小規模就直接DFS吧。大規模的時候DFS剪枝。不過確實不好做呀。
有向無圈圖的話可以用dijstra貪心,或者簡單用folyed演算法就可以了(把最小化變為最大化)。
有圈的話您……或者能縮圈嗎?可以考慮。總之比較複雜。