一些常見的排序演算法

2021-05-24 12:12:47 字數 1304 閱讀 7789

為了便於說明,假設是公升序排列,降序容易以此推斷

1、選擇排序

查詢數列(含n個數)中的最大項並把它與最後一項交換,然後查詢數列前n-1項中的最大項,並把它與這n-1項的最後一項交換,以此類推。

2、氣泡排序

比較相鄰的兩項資料,如果次序顛倒則交換之,最多需要比較n+1趟。第一趟結束,最大項已經到末尾,故比較n+1次;第二趟需比較n+2次,並且結束後最後兩項已經排好。以此類推。

3、插入排序

一開始,陣列是未排序的。先將前兩個數正確排序,取第三個數,與插入前兩個數的正確位置,則前三個已正確排列,然後取第四個,同理...可以在同乙個陣列裡進行。

4、歸併排序

歸併排序時重要的分治演算法之一,運用遞迴演算法。

先遞迴呼叫將陣列反覆分段,直到每一段只包含乙個資料項;然後將這些小項用歸併的方法合成乙個較大的資料項,具體的方法是,取兩端陣列中較小的項放在臨時陣列的最前面(只需比較兩個陣列的第一項資料),當某一段陣列已經沒有資料項了,則直接將另一陣列的剩餘項新增到臨時陣列的最後。,遞迴呼叫,最後就剩下乙個陣列時排序完成。

5、快速排序

快速排序也是一種重要的分治演算法之一,一般也用遞迴實現。

取陣列中的任意一項作為樞軸,然後分別對兩邊進行排序,運用遞迴呼叫可以得到分解到只有三項時的排序。

6、基數排序

乙個簡單的基數排序的例子是字串的排序,先按字串(共n個)的第n個字元的值將字串分為a,b,c...x,y,z個組,保持目前的順序,按第n-1個字串的值做相同的分組,以此類推。

例:原字串:abc,xyz,bwz,aac,rlt,jbx,rdt,klt,aeo,tlj

第一次分組:(abc,aac)(tlj)(aeo)(rlt,rdt,klt)(jbx)(xyz,bwz)

第二次分組:(aac)(abc,jbx)(rdt)(aeo)(tlj,rlt,klt)(bwz)(xyz)

第三次分組:(aac,abc,aeo)(bwz)(jbx)(klt)(rdt,rlt)(tlj)(xyz)

排序結束。

7、樹形排序

樹形排序是基於二叉搜尋樹的。

二叉搜尋樹的定義如下:1、n的值大於其左子樹tl中的所有值;2、n的值小於其右子樹tr中的所有值;3、tl與tr都是二叉搜尋樹。

對二叉搜尋樹進行中序遍歷既可以得到公升序順序的節點排列。

8、堆排序

堆排序是基於堆adt的。

堆的定義:堆是一棵完全二叉樹,並且1、此樹為空或2、其根的值大於所有孩子的值且根有堆作為它的子樹。

將堆的根放到陣列最後,然後將剩餘的節點重新構成堆,以此重複直至排序完成。

例如下圖所示:

演算法效率比較如下:

一些常見的排序演算法

複雜度為n 2的排序 常見的有 插入排序 氣泡排序 選擇排序 地精排序,是插入排序的另一種寫法,可以只用乙個迴圈 public static int charu int ins else return ins public static int int in return in public sta...

常見的一些演算法

1.判斷乙個數是否為素數 質數 判斷乙個數是否為素數 method1 bool judgeprime int number std cout number return true 判斷乙個數是否為素數 method2 bool judgeprime2 int number std cout numb...

用PHP實現一些常見的排序演算法

1 氣泡排序 兩兩相比,每迴圈一輪就不用再比較最後乙個元素了,因為最後乙個元素已經是最大或者最小。function maopaosort list return list 2 選擇排序 選定乙個作為基本值,剩下的和這個比較,然後調換位置。function xuanzesort list if pos...