常見排序演算法

2021-09-24 11:32:11 字數 1456 閱讀 8998

主要是學習記載,**存放於有不對的或者不合理的地方請各位大神指教

1、簡單排序

⑴ 思想:

①從第乙個為主鍵開始,逐個與後面數字比較,如果發現比它小的就交換位置,一次迴圈下來可以將最小的值放在第一位。

②接著從第二位為主鍵繼續開始與後面的比較,從第三位逐漸到最後一位,第二位就是第二小的值。

③如此迴圈直到倒數第二位。

⑵演算法複雜度分析:

需要乙個額外的空間來做交換。

交換執行次數 按照最壞的情況(倒序)來看,第一輪需要n-1次交換,第二輪需要n-2。那麼總共需要n-1+n-2+n-3+...+1次交換和比較;

最好的情況下需要n-1+n-2+n-3+...+1次比較。

2、氣泡排序

⑴思想向水泡往上飄一樣,每次從最後乙個開始與向前相鄰的比較將小的那個放在前面,大的放在後面,繼續前移一位從倒數第二個與它前乙個比較,依然大的在後面,小的在前面。這樣一輪下來最前面的那個就是最小的。相應的會將一些在後面的小值往前稍微移動。迴圈n-1輪到達排序的效果。

⑵ 演算法複雜度分析:

需要乙個額外的空間來輔助交換。

時間複雜度上倒序需要n-1+n-2+n-3+...+1比較和交換,但是在現實中資料時是無序的,所以在前幾輪就有可能排好序(可以新增額外的flag來記錄是否已經排好序較少比較次數)。

3、選擇排序

⑴思想每次迴圈找出未排序區域的最小值,記錄位置,與第乙個無序區域交換。

①從第乙個開始,找見最小值,放到第一位

②從第二位開始,找見最小值,放到第二位

⑵複雜度分析

需要乙個記錄無序區域最小值指標記錄,乙個輔助交換的空間

這裡的複雜度和上方一樣,都是平方級的複雜度

4、插入排序

⑴ 思想

從第乙個開始,與第二個比較,如果第乙個比第二個大,則將第二個插入第乙個之前。後方的也是,每次和前方已經排好順序的區域從後往前比較,將它插入到有序區域的合理位子。

比如134是有序區,82765是無序區,到了8的時候不需要移動,而到了2的時候則需要拿出來放到3的前面。

⑵複雜度分析

需要乙個空間輔助交換。

倒序的話需要很大的移動量,每次比較都有移動。

5、堆排序

思想:一種利用完全二叉樹的思想構成的極大頂點二叉樹。利用了完全二叉樹中子節點的下標除以2是父母節點的下標,這樣構建極大堆。每次在第乙個位置上都是最大的值,將它與最後乙個無序區域的值交換位置。

6、希爾排序

思想是對插入排序的一種公升級,將插入排序的相鄰比較換成了指定距離的值比較。不斷縮小間隔的值,達到排序的目的

7、歸併排序

⑴思想先分割陣列到小陣列,不斷的分割成最小的陣列,對小陣列排序,然後將小陣列倆倆合併 成乙個大的有序陣列,直到成為乙個陣列

⑵複雜度分析

空間複雜度較大   

8、快速排序

每次找見乙個值,將比他小的放在它的左邊,比它大的放在右邊,這樣繼續為兩邊的無須陣列做同樣操作,直到最後。 

常見排序演算法

一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...

常見排序演算法

1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...

常見排序演算法

排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...