幾種常見排序演算法的總結(Java版上)

2021-08-20 10:54:22 字數 3296 閱讀 1157

排序操作在計算機程式設計中分為外部排序和內部排序。我們一般所說的排序演算法指的就是內部排序,即資料記錄在計算機記憶體中進行排序。

上圖為內部排序的腦圖。下來九種排序演算法我們一一介紹。

1、氣泡排序

(1)基本思想:

假設 n 個數進行排序,則需要比較 n - 1 輪,第一輪比較 n - 1 次,之後每輪比較減少 1 次。

(2)**實現:

第乙個版本:

public static void bubblesort(int a) 

} }}

第一版本存在這樣的問題:假設一陣列長度為 6 ,故需要比較 5 輪,但會發現在第 4 輪就已完成,第 5 輪比較就沒有意義了,所以還能繼續優化。設定乙個boolean 變數 flag ,判斷某輪比較中是否發生資料交換。若沒有發生則表示排序完成,就可以立即停止。

第二個版本:

public static void bubblesort(int a) 

}if(!flag) break;//如果為false則排序完成,跳出外層迴圈}}

(3)演算法分析:

最壞時間複雜度:o(n^2)    最好時間複雜度:o(n)    故平均複雜度為:o(n^2)穩定性:演算法是比較相鄰兩個元數,交換也發生在這兩個元數上,兩個相鄰元數值相等不會交換,排序前排序後相等的兩個元數的相對順序不會發生改變,故演算法具有穩定性。2、快速排序(1)基本思想:(利用了遞迴與分治策略的思想)

一輪快排具體操作是:i 和 j 開始分別置於陣列的最左端和最右端,設某個數為基準(一般取第 0 個數)。首先 j 先向左移動找到第乙個小於「基準」的數並和基準相互交換,然後 i 向右移動找到第乙個大於「基準」的數並和基準交換;重複這兩步直到 i == j 。

其實實際排序中沒有必要找到符合要求的數就和「基準」進行交換,因為只需要在i == j 的位置才是最後基準的位置,所以現在現將 基準暫存在 a [0] 位上,j 和 i 各自移動,找到符合條件(比基準小 / 大)的數,直到一輪排序結束再將基準移動到正確位置。

(2)**實現:

public static void quicksort(int  a,int left,int right)

while(i < j && a [i] < pivotkey)// i 從左向右找第乙個大於基準的值

i++;

if(i < j)

}a [i] = pivotkey;// i== j 時將基準放置 i 處

quicksort(a,left,i - 1);//遞迴呼叫

quicksort(a,i + 1,right);

}

(3)演算法分析:

最壞時間複雜度:o(n^2)    最好時間複雜度:o(n logn)    故平均複雜度為:o(n logn)

穩定性:陣列 基準元素為 5 ,和第四個元素 2 交換,兩個 2 的相對順序發生改變,故演算法不穩定。

3、簡單選擇排序

(1)基本思想:

如圖示例:陣列長度為 8,需要比較 7 輪,第一輪需要比較 7 次,之後每輪比較次數減 1。

(2)**實現:

public static void selectsort(int  a)  一次選擇的最小元素的值為 3 ,然後和第乙個 4 交換,兩個 4 的相對位置發生變化,故該演算法不穩定。4、堆排序堆的定義:n 個元素的序列  當且僅當滿足以下關係:大頂堆完全二叉樹:                                   小頂堆完全二叉樹:

ki <= k2i                                                 ki >= k2i

ki <= k2i+1                                            ki >= k2i+1(i = 1,2,3,……,n/2)

示例:

(1)基本思想:

(2)**實現:

// 堆排序

public static void heapsort(int a)

// 2.調整堆結構+交換堆頂元素與末尾元素

for (int j = a.length - 1; j > 0; j--)

}public static void adjustheap(int a, int i, int length)

if (a[k] > temp) else

}a[i] = temp;// 將temp值放到最終的位置

}

(3)演算法分析:

初始化堆為 o(n) ,交換堆元素並重建堆為 o(n logn) ,其時間複雜度最壞/最好/平均都是 o(n logn)

空間複雜度為 o( 1 )

參考文章:

幾種常見的排序演算法總結

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。乙個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到乙個符合實際的優秀...

java中幾種常見的排序演算法

本人只研究過氣泡排序 選擇排序和快速排序,下面是快速排序的 一 冒泡 bubble 排序 氣泡排序 bubblesort 的基本思想是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。如此重複下去,直至最終完成排序。時間複雜度為 o n n 適用於排序小列表。void bubblesortarr...

java實現常見的幾種排序演算法

public static void selectsort int array if i min public static void bubble int array if flag false public static void insertsort int numbers numbers j...