穩定:如果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 ...