1 簡單選擇排序
簡單選擇排序是最簡單直觀的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小(或最大)的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。
在演算法實現時,每一趟確定最小元素的時候會通過不斷地比較交換來使得首位置為當前最小,交換是個比較耗時的操作。其實我們很容易發現,在還未完全確定當前最小元素之前,這些交換都是無意義的。我們可以通過設定乙個變數min,每一次比較僅儲存較小元素的陣列下標,當輪迴圈結束之後,那這個變數儲存的就是當前最小元素的下標,此時再執行交換操作即可。**實現很簡單,一起來看下。
/**
* 簡單選擇排序
**@param arr
*/public
static
void
selectsort(int arr)
}//進行交換,如果min發生變化,則進行交換
if (min != i) }}
/** * 交換陣列元素
*@param arr
*@param a
*@param b
*/public
static
void
swap(int arr,int a,int b)
簡單選擇排序通過上面優化之後,無論陣列原始排列如何,比較次數是不變的;對於交換操作,在最好情況下也就是陣列完全有序的時候,無需任何交換移動,在最差情況下,也就是陣列倒序的時候,交換次數為n-1次。綜合下來,時間複雜度為o(n2)
2 氣泡排序
氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序
在氣泡排序的過程中,如果某一趟執行完畢,沒有做任何一次交換操作,比如陣列[5,4,1,2,3],執行了兩次冒泡,也就是兩次外迴圈之後,分別將5和4調整到最終位置[1,2,3,4,5]。此時,再執行第三次迴圈後,一次交換都沒有做,這就說明剩下的序列已經是有序的,排序操作也就可以完成了,來看下**
/**
* 氣泡排序
**@param arr
*/public
static
void
bubblesort(int arr)
}if (flag) }}
根據上面這種冒泡實現,若原陣列本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數為 n-1+n-2+…+1=n(n-1)/2,交換次數和比較次數等值。所以,其時間複雜度依然為o(n2)。綜合來看,氣泡排序效能還還是稍差於上面那種選擇排序的。
3 直接插入排序
直接插入排序基本思想是每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
* 插入排序
**@param arr
*/public
static
void
insertionsort(int arr) }}
簡單插入排序在最好情況下,需要比較n-1次,無需交換元素,時間複雜度為o(n);在最壞情況下,時間複雜度依然為o(n2)。但是在陣列元素隨機排列的情況下,插入排序還是要優於上面兩種排序的。
常見排序演算法
一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...
常見排序演算法
1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...
常見排序演算法
排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...