常用排序演算法

2021-08-28 02:29:26 字數 2158 閱讀 6476

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

時間複雜度:o(n^2),最優時間複雜度:o(n),平均時間複雜度:o(n^2)

}// 如果沒有交換,代表已經排序完畢,直接返回

if (flag == 0) }}

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5

時間複雜度:o(n^2),最優時間複雜度:o(n),平均時間複雜度:o(n^2)

下面展示了兩種插入排序的實現,第二種方法減少了交換次數。

public static void insertionsort(comparable a) }}

public static void insertionsort(comparable a) 

a[j] = temp;}}

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到已排序序列的末尾。

時間複雜度:o(n^2),最優時間複雜度:o(n^2),平均時間複雜度:o(n^2)

從數列中挑出乙個元素,稱為"基準"(pivot),

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

時間複雜度:o(n^2),最優時間複雜度:o(nlogn),平均時間複雜度:o(nlogn)

快排的時間複雜度跟選取基準的方法有關,一下是預設選擇了第乙個元素作為基準,隨機性較大。

可以在序列中選取開始中間結尾三個數的中位數作為基準,進行優化。

public static void quicksort(int a) 

public static void quicksort(int a, int lo, int hi)

int j = partition(a, lo, hi);

quicksort(a, lo, j - 1);

quicksort(a, j + 1, hi);

}public static int partition(int a, int lo, int hi)

}while (v < a[--j])

}if (i >= j)

temp = a[i];

a[i] = a[j];

a[j] = temp;

}temp = a[lo];

a[lo] = a[j];

a[j] = temp;

return j;

}

參考部落格:

常用排序演算法

筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 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 ...