交換排序
氣泡排序
基本思想很簡單,如果要求排序後序列中元素按照從小到大的順序排列,則氣泡排序的步驟如下:
1、依次比較序列中相鄰的兩個元素,將較大的放在後面,這樣一趟比較後,最大的元素就放在了最後的乙個位置;
2、再依次比較相鄰的兩個元素,將第二大的元素最終放到倒數第二個位置;
3、依次迴圈,直到最小的元素放在了第乙個位置,排序完成。
根據以上思想,很容易寫出實現**:
/*
氣泡排序後的順序為從小到大
*/void bubblesort(int array)
}
氣泡排序最好的
時間複雜度
為o(n),最壞的時間複雜度為o(n^2),平均時間複雜度為o(n^2)。
我們回過頭來再來看上面氣泡排序的思想,無論原始序列的排序是怎樣的(哪怕已經是從小到大排好的),它都要進行n-1趟比較,每趟比較又要進行n-i-1次相鄰元素間的比較(i為從0開始計的第i趟比較),而實際上,很有可能還沒有進行第n-1趟比較,已經完成了排序,這時候後面的幾趟比較就顯得多餘了,基於此,我們可以做如下改進:設定乙個
標誌位,如果某一趟有元素發生交換,則為true,繼續下一趟比較,否則,說明排序已經完成,則標誌位為false,退出迴圈。改進後的實現**如下:
public class bubblesort ;
print(bubblesort.bubblesort(arr));
} public static int bubblesort(int array)
}} return array;
} public static void print(int array)
}}
快速排序
快速排序是已知的平均時間複雜度均為o(n*logn)的幾種排序演算法中效率最高的乙個,該演算法之所以特別快,主要是由於非常精煉和高度優化的內部迴圈,它在最壞情況下的時間複雜度為o(n^2),但只要稍加努力(正確選擇樞軸元素)就可以避免這種情形。快速排序採用了分治思想,其具體基本思想如下:
1、從待排序列中任選乙個元素作為樞軸;
2、將序列中比樞軸大的元素全部放在樞軸的右邊,比樞軸小的元素全部放在其左邊;
3、以樞軸為分界線,對其兩邊的兩個子串行重複執行步驟1和2中的操作,直到最後每個子串行中只有乙個元素。
一趟快速排序(以排序後從小到大為例)的具體做法如下:
附設兩個元素指標low和high,初值分別為該序列的第乙個元素的序號和最後乙個元素的序號,設樞軸元素的值為temp,則首先從high所指位置起向前搜尋到第乙個值小於temp的元素,並將其和temp互換位置,而後從low所指位置起向後搜尋到第乙個值大於temp的元素,並將其和temp交換位置,如此反覆 ,直到low=high為止。
在內部排序中為了盡量避免比較多的元素交換操作,因此下面的分析和**的實現中,我們並不是採取交換操作,而是先將樞軸元素儲存在val變數中,然後每次遇到需要交換的元素時,先將該元素賦給val所在的位置,而後再將該元素所在位置「挖空」,之後的每一次比較,就用需要交換的元素來填充上次「挖空」的位置,同時將交換過來的元素所在的位置再「挖空」,以等待下次填充。
public class quicksort ;
print(quicksort.quicksort(arr, 0, arr.length - 1));
} public static int quicksort(int array, int low, int high)
return array;
} /**
* 該函式返回分割點數值所在的位置
* low剛開始表示排序範圍內的第乙個元素的位置,逐漸向右移動
* high剛開始表示排序範圍內的最後乙個位置,逐漸向左移動
*/public static int findpos(int array, int low, int high)
array[low] = array[high];
while (low < high && array[low] <= temp)
array[high] = array[low];
} // 最終low=high
array[low] = temp;
return low;
} public static void print(int array)
}}
ps:
通常,快速排序被認為在所有同數量級(平均時間複雜度均為o(n*logn))的排序方法中,平均效能最好。但是若初始記錄已經基本有序,這樣每次如果還選擇第乙個元素作為樞軸元素,則再通過樞軸劃分子串行時,便會出現「一邊倒」的情況,此時快速排序就完全成了氣泡排序,這便是最壞的情況,時間複雜度為o(n^2)。所以通常樞軸元素的選擇一般基於「三者取中」的原則,即比較首元素、末元素、中間元素的值,取三者中中間大小的那個。經驗表明,採取這種方法可以大大改善快速排序在最壞情況下的效能。
快速排序需要乙個棧來實現遞迴,很明顯,如果序列中的元素是雜亂無章的,而且每次分割後的兩個子串行的長度相近,則棧的最大深度為o(logn),而如果出現子串行「一邊倒」的情況,則棧的最大深度為o(n)。因此就平均情況來看,快速排序的空間複雜度為o(logn)。
內部排序之交換排序
快速交換排序簡介及其 冒泡交換排序及其 交換排序總結 我們知道假如乙個已排好序的陣列,假如是從小到大公升序排列,則隨便取其中乙個數n,則n左邊所有數都小於或等於n,右邊的都大於或等於n.那反向思維下,我們先隨便取陣列第乙個數為基準x,然後將所有小於它的數交換到左邊,大於它的數交換到右邊.最後x可能就...
經典內部排序之交換排序
經典內部排序演算法有交換排序 插入排序 選擇排序 歸併排序 分配排序。分類如下 交換排序 氣泡排序 快速排序。插入排序 直接插入排序 折半插入排序 希爾排序。選擇排序 直接選擇排序 堆排序。歸併排序 分配排序 基數排序 桶排序。本博文將介紹交換排序。一 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的...
交換排序 2 快速排序
快速排序 快速排序的基本演算法思想是 設待排序的元素序列個數為 n,存放在陣列 a中,令第乙個元素為樞軸元素,即將 a 0 作為參考元素,令 pivot a 0 初始時,令 i 0 j a.legth 1 然後按以下方法操作 1 從序列的 j位置往前,依次將陣列的中的元素與樞軸元素相比較,如果當前元...