日常操作中常見的排序方法有:冒泡排序、快速排序、選擇排序、插入排序、希爾排序,甚至還有基數排序、雞尾酒排序、桶排序、鴿巢排序、歸併排序等。
冒泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
/**<br /> * 冒泡法排序<br/><br /> * <ul><br /> * <li>比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。</li><br /> * <li>對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。</li><br /> * <li>針對所有的元素重複以上的步驟,除了最後一個。</li><br /> * <li>持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。</li><br /> * </ul><br /> *<br /> * @param numbers<br /> * 需要排序的整型數組<br /> */<br />public static void bubbleSort(int[] numbers) {<br />int temp; // 記錄臨時中間值<br />int size = numbers.length; // 數組大小<br />for (int i = 0; i < size - 1; i++) {<br />for (int j = i + 1; j < size; j++) {<br />if (numbers[i] < numbers[j]) { // 交換兩數的位置<br />temp = numbers[i];<br />numbers[i] = numbers[j];<br />numbers[j] = temp;<br />}<br />}<br />}<br />}
快速排序使用分治法策略來把一個序列分為兩個子序列。
/**<br /> * 快速排序<br/><br /> * <ul><br /> * <li>從數列中挑出一個元素,稱為“基準”</li><br /> * <li>重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割之後,<br /> * 該基準是它的最後位置。這個稱為分割(partition)操作。</li><br /> * <li>遞迴地把小於基準值元素的子數列和大於基準值元素的子數列排序。</li><br /> * </ul><br /> *<br /> * @param numbers<br /> * @param start<br /> * @param end<br /> */<br />public static void quickSort(int[] numbers, int start, int end) {<br />if (start < end) {<br />int base = numbers[start]; // 選定的基準值(第一個數值作為基準值)<br />int temp; // 記錄臨時中間值<br />int i = start, j = end;<br />do {<br />while ((numbers[i] < base) && (i < end))<br />i++;<br />while ((numbers[j] > base) && (j > start))<br />j--;<br />if (i <= j) {<br />temp = numbers[i];<br />numbers[i] = numbers[j];<br />numbers[j] = temp;<br />i++;<br />j--;<br />}<br />} while (i <= j);<br />if (start < j)<br />quickSort(numbers, start, j);<br />if (end > i)<br />quickSort(numbers, i, end);<br />}<br />}
選擇排序是一種簡單直觀的排序方法,每次尋找序列中的最小值,然後放在最末尾的位置。
/**<br /> * 選擇排序<br/><br /> * <ul><br /> * <li>在未排序序列中找到最小元素,存放到排序序列的起始位置</li><br /> * <li>再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。</li><br /> * <li>以此類推,直到所有元素均排序完畢。</li><br /> * </ul><br /> *<br /> * @param numbers<br /> */<br />public static void selectSort(int[] numbers) {<br />int size = numbers.length, temp;<br />for (int i = 0; i < size; i++) {<br />int k = i;<br />for (int j = size - 1; j >i; j--) {<br />if (numbers[j] < numbers[k]) k = j;<br />}<br />temp = numbers[i];<br />numbers[i] = numbers[k];<br />numbers[k] = temp;<br />}<br />}