Java實現幾種常見排序方法(上)

來源:互聯網
上載者:User
 

日常操作中常見的排序方法有:冒泡排序、快速排序、選擇排序、插入排序、希爾排序,甚至還有基數排序、雞尾酒排序、桶排序、鴿巢排序、歸併排序等。

冒泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

/**<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 />}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.