常用排序演算法

2021-09-11 07:20:43 字數 3562 閱讀 5119

穩定:如果a原本在b的前面,而a=b,排序後a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b,排序後a可能會出現在b的後面。

時間複雜度:對排序資料的總的操作次數。反映當n變化時,操作次數呈現的規律。

空間複雜度:是指演算法在計算機內執行時所需儲存空間的度量,是資料規模n的函式。

排序方法

平均時間複雜度

最壞時間複雜度

最好時間複雜度

空間複雜度

穩定性氣泡排序

o(n^2)

o(n^2)

o(n)

o(1)

穩定選擇排序

o(n^2)

o(n^2)

o(n^2)

o(1)

不穩定快速排序

o(n*logn)

o(n^2)

o(n*logn)

o(n*logn)

不穩定插入排序

o(n^2)

o(n^2)

o(n)

o(1)

穩定歸併排序

o(n*logn)

o(n*logn)

o(n*logn)

o(n)

穩定希爾排序

o(n^1.3)

o(n^2)

o(n)

o(1)

不穩定邏輯描述:

從頭開始,相鄰元素比較,順序不對則互換位置,直至最大或最小元素排在最後位置,第一輪結束;

再次從頭開始,重複上述邏輯,此時已排好元素不在比較範圍內;

重複上述邏輯,直至所有元素均已排好順序。

**示例:

public static void bubblesort(int array) }}

}

邏輯描述:

從頭開始,假設第乙個元素為最小/最大元素,記錄其下標值,再依次與後續元素比較,如果有更小/更大元素則替換下標值,

直到確定最大/最小元素下標,交換元素位置,第一輪比較結束;

從第二個元素開始,重複上述過程,確定此輪比較過程的最大/最小元素;

重複上述過程,直至所有元素均已排好順序。

**示例:

public static void selectsort(int array) 

}// 交換最大/最小元素

if (minindex != i)

}}

邏輯描述:

假設第乙個元素為基準值,從後方開始向前推進直至遇到小於基準值的位置,交換該元素與基準值位置;

從前方開始,跳過第乙個元素向後方推進直至遇到大於基準值的位置,交換該元素與基準值位置(已不再開始的位置);

重複上述過程,直到兩個方向相遇,此時比基準值小的都放在準值左邊,比基準值大的都放在準值右邊;

分別對準值兩側陣列重複上述過程~遞迴呼叫,直至最後所有元素排好順序。

**示例:

public static void fastsort(int array, int low, int high) 

if (array[end] < key)

// 從前往後比較大小,遇見比基數大的,交換位置

while (end > start && array[start] <= key)

if (array[start] > key)

}// 此時第一次迴圈比較結束,關鍵值的位置已經確定了。

// 左邊的值都比關鍵值小,右邊的值都比關鍵值大,

// 但是兩邊的順序還有可能是不一樣的,進行下面的遞迴呼叫

if (start > low)

if (end < high)

}// 資料互換

private static void swap(int array, int start, int end)

邏輯描述:

從第二個元素開始,假設前方元素為已排序序列,對已排序序列依次比較,

如果已排序序列中元素大於待排序元素,交換元素位置,直至已排序序列比較完畢;

重複上述過程,直至所有元素均已排好順序。

**示例:

// 第一種寫法

public static void insertsort1(int array)

array[j + 1] = temp;

}}// 第二種寫法

public static void insertsort2(int array) }}

}// 第三種寫法

public static void insertsort3(int array) }}

}

邏輯描述:

建立在歸併操作上的排序演算法,是採用分治法的典型應用。將已有序的子串行合併,得到完全有序的序列。即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。

**示例:

public static void mergesort(int inputs, int low, int high) 

int mid = (low + high) / 2;

// 分拆兩組遞迴呼叫

mergesort(inputs, low, mid);

mergesort(inputs, mid + 1, high);

// 合併有序序列

merge(inputs, low, mid, high);

}private static void merge(int inputs, int low, int mid, int high) else

k++;

}// 將有序序列剩餘數值放入新陣列

while (i <= mid)

while (j <= high)

// 重新賦值舊陣列

for (int m = 0; m < temp.length; m++)

}

邏輯描述:

是插入排序的改進版,與插入排序不同之處在於,它會優先比較距離較遠的元素。希爾排序又稱為縮小增量排序。

**示例:

public static void shellsort(int array) 

// 確定d有效範圍內的最大值

d = (d - 1) / 3;

while (d > 0)

array[j + d] = temp;

}// 以固定幅度向前推進

d = (d - 1) / 3;

}}

推薦乙個**,有各種資料結構&排序演算法等動態演示效果

data structure visualizations

如有錯誤和不當之處,請指教~謝謝!

常用排序演算法

筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序 l很多演算法將排序作為...

常用排序演算法

一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...

常用排序演算法

排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...