排序是資料處理中十分常見且核心的操作,雖說實際專案開發中很小幾率會需要我們手動實現,畢竟每種語言的類庫中都有n多種關於排序演算法的實現。但是了解這些精妙的思想對我們還是大有裨益的。本文簡單溫習下最基礎的三類演算法:選擇,冒泡,插入。
先定義個交換陣列元素的函式,供排序時呼叫
* 交換陣列元素
* @param arr
* @param a
* @param b
public static void swap(int arr,int a,int b){
arr[a] = arr[a]+arr[b];
arr[b] = arr[a]-arr[b];
arr[a] = arr[a]-arr[b];
簡單選擇排序
簡單選擇排序是最簡單直觀的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小(或最大)的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。
在演算法實現時,每一趟確定最小元素的時候會通過不斷地比較交換來使得首位置為當前最小,交換是個比較耗時的操作。其實我們很容易發現,在還未完全確定當前最小元素之前,這些交換都是無意義的。我們可以通過設定乙個變數min,每一次比較僅儲存較小元素的陣列下標,當輪迴圈結束之後,那這個變數儲存的就是當前最小元素的下標,此時再執行交換操作即可。**實現很簡單,一起來看下。
**實現
* 簡單選擇排序
* @param arr
public static void selectsort(int arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;//每一趟迴圈比較時,min用於存放較小元素的陣列下標,這樣當前批次比較完畢最終存放的就是此趟內最小的元素的下標,避免每次遇到較小元素都要進行交換。
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
//進行交換,如果min發生變化,則進行交換
if (min != i) {
swap(arr,min,i);
簡單選擇排序通過上面優化之後,無論陣列原始排列如何,比較次數是不變的;對於交換操作,在最好情況下也就是陣列完全有序的時候,無需任何交換移動,在最差情況下,也就是陣列倒序的時候,交換次數為n-1次。綜合下來,時間複雜度為o(n2)
氣泡排序
氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序
**實現
在氣泡排序的過程中,如果某一趟執行完畢,沒有做任何一次交換操作,比如陣列[5,4,1,2,3],執行了兩次冒泡,也就是兩次外迴圈之後,分別將5和4調整到最終位置[1,2,3,4,5]。此時,再執行第三次迴圈後,一次交換都沒有做,這就說明剩下的序列已經是有序的,排序操作也就可以完成了,來看下**
* 氣泡排序
* @param arr
public static void bubblesort(int arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;//設定乙個標記,若為true,則表示此次迴圈沒有進行交換,也就是待排序列已經有序,排序已然完成。
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr,j,j+1);
flag = false;
if (flag) {
break;
根據上面這種冒泡實現,若原陣列本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數為 n-1+n-2+...+1=n(n-1)/2,交換次數和比較次數等值。所以,其時間複雜度依然為o(n2)。綜合來看,氣泡排序效能還還是稍差於上面那種選擇排序的。
直接插入排序
直接插入排序基本思想是每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
**實現
* 插入排序
* @param arr
public static void insertionsort(int arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
swap(arr,j,j-1);
j--;
簡單插入排序在最好情況下,需要比較n-1次,無需交換元素,時間複雜度為o(n);在最壞情況下,時間複雜度依然為o(n2)。但是在陣列元素隨機排列的情況下,插入排序還是要優於上面兩種排序的。
3種簡單排序 選擇,冒泡,直接插入
include include using namespace std selectsort void selectsort vector a if min i std swap a i a min return bubblesort void bubblesort vector a if flag...
簡單排序 氣泡排序 簡單選擇排序 直接插入排序演算法
一.氣泡排序 基本思想 兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。1.正宗的冒泡演算法 function bubblesort arr return arr 2.改進的冒泡演算法 function bubblesort arr return arr 3.複雜度分析 時間複雜度...
排序(冒泡 直接插入 選擇)
從小到大 int j,temp for int i 0 i arr.length 1 i else if j將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表,再從剩下的關鍵字中選取下乙個插入物件 for int i 0 i arr.length i arr j temp co...