六大演算法錦集

2022-02-01 23:33:34 字數 2825 閱讀 9606

1、氣泡排序

在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

氣泡排序是穩定的。演算法時間複雜度o(n2)--[n

的平方]

main()

printf(

"the corret sort of those numbers is:");

for(i=0;i<10;i++)

printf("%d

",a[i]);

printf("\n

");}

2、選擇排序

在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。

選擇排序是不穩定的。演算法複雜度o(n2)--[n

的平方]

main()

printf(

"the correct sort of those number is:");

for(i=0;i<10;i++)

printf("%d

",a[i]);

printf("\n

");}

3、插入排序

在要排序的一組數中,假設前面(n-1) [n>=2] 

個數已經是排好順序的,現在要把第

n個數插到前面的有序數中,使得這

n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

直接插入排序是穩定的。演算法時間複雜度o(n2)--[n

的平方]

main()

a[i+1]=m;

}printf(

"the correct order of those numbers is:");

for(i=0;i<10;i++)

printf("%d

",a[i]);

printf("\n

");}

4、快速排序

快速排序是對氣泡排序的一種本質改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1

。快速排序通過一趟掃瞄,就能確保以某個數為基準點的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。

顯然快速排序可以用遞迴實現,當然也可以用棧化解遞迴實現。

快速排序是不穩定的。最理想情況演算法時間複雜度o(nlog2n)

,最壞o(n2)

quick(int first,int end,int

l) l[left]=key;

return

left;

}quick_sort(

int l,int first,int

end)

}main()

view code

5、希爾排序

d.l.shell於

1959

年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量

d分成若干組,每組中記錄的下標相差

d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到

1時,整個要排序的數被分成一組,排序完成。

下面的函式是乙個希爾排序演算法的乙個實現,初次取序列的一半為增量,

以後每次減半,直到增量為1

。希爾排序是不穩定的。

void shell_sort(int *x, int

n) *(x+k+h) =t;}}

}

view code

6、堆排序

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。堆的定義如下:具有n

個元素的序列(

h1,h2,...,hn),

當且僅當滿足(

hi>=h2i,hi>=2i+1

)或(hi<=h2i,hi<=2i+1

)(i=1,2,...,n/2)

時稱之為堆。在這裡只討論滿足前者條件的堆。

由堆的定義可以看出,堆頂元素(即第乙個元素)必為最大項。完全二叉樹可以

很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存順序,使之成為乙個堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)

個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有

n個節點的有序序列。

從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。有最大堆和最少堆之分。

堆排序是不穩定的。演算法時間複雜度o(nlog2n)

。功能:滲透建堆

void sift(int *x, int n, int

s)

if (t

調整*/

else

/*沒有需要調整了,已經是個堆了,退出迴圈。

*/ }

*(x+k) = t; /*

開始元素放到它正確位置

*/}

view code

功能:堆排序

void heap_sort(int *x, int

n)

for (k=n-1; k>=1; k--)

}

view code

機器學習常用六大演算法

機器學習是人工智慧行業的乙個創新且重要的領域。我們為機器學習程式選擇的演算法型別,取決於我們想要實現的目標。現在,機器學習有很多演算法。可能對於初學者來說,這是相當不堪重負的。此前,educative.io 聯合創始人法希姆烏爾哈克 fahim ul haq 發文簡要介紹了幾種流行的機器學習演算法,...

經典演算法題錦集

經典演算法題每日演練 第二十五題 塊狀鍊錶 經典演算法題每日演練 第二十四題 梳排序 經典演算法題每日演練 第二十三題 雞尾酒排序 經典演算法題每日演練 第二十二題 奇偶排序 經典演算法題每日演練 第二十一題 十字鍊錶 經典演算法題每日演練 第二十題 三元組 經典演算法題每日演練 第十九題 雙端佇列...

Windows Vista六大版本

home將分為 windows starter 2007 初級版本 windows vista home basic 初級家庭版 還有專門針對歐洲市場的 home basic n windows vista home premium 增強家庭版 windows vista ultimate 終極版 ...