標籤:冒泡排序 public 獨立 rgs 排序 tin sys 演算法思想 int
快速排序(Quicksort)是對冒泡排序的一種改進。在大學學過之後現在基本忘了,最近在好多地方都看到說快速排序在面試會問到,於是自己也準備重新拾起以前忘記的東西來,慢慢的積累自己的基礎知識。fighting
演算法概念
快速排序由C. A. R. Hoare在1962(50多年了呢)年提出,它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列(摘自百度百科)。
快速排序採用了一種分治的策略,所以有時候我們也稱為分治演算法。
演算法思想
1.先從數列中取出一個數作為基準數,一般會取第一個數做為基準數。
2.然後對數列進行分區,首先將比這個基準數大的數全放到它的右邊,小於或等於基準數的數全放到它的左邊(一刀切,左邊小於基準數,右邊大於基準數)。
3.再對劃分的左右區間重複第二步,直到各區間只剩一個數就完成了排序。
下面畫一個詳細的大圖,只畫了第一趟排序的過程,知道第一躺怎麼排序,後面都是一樣的。
演算法代碼
package com.roc.Quicksort;/** * 快速排序 * * @author liaowp * */public class Quicksort { static void sort(int value[], int left, int right) { if (left < right) {// 判斷左邊的下標是小於右 int i = left, j = right;// i為小值,j為大值 int temp = value[left];// 預設中間數為temp,即最左邊的數 while (i < j) {// 如果i<j while (i < j && value[j] >= temp) {// 從右往左比較,如果i<j且value[j]>=temp j--; } if (i < j) {// 如果i<j,找到有比中間數大的 value[i] = value[j];// 左邊的數放右邊的數 i++;// 左移一位 } while (i < j && value[i] < temp) {// 從左往右找 i++; } if (i < j) {// 找到有比中間數小的,替換到右邊 value[j] = value[i]; j--; } } value[i] = temp; for (int n = 0; n < value.length; n++) { System.out.print(value[n] + " "); } System.out.println(); sort(value, left, i - 1);// 左邊的重複 sort(value, i + 1, right);// 右邊的重複 } } public static void main(String[] args) { int value[] = { 5, 1, 8, 4, 15 }; System.out.print("未經處理資料:"); for (int i = 0; i < value.length; i++) { System.out.print(value[i] + " "); } System.out.println(); sort(value, 0, 4); System.out.print("排序結果:"); for (int i = 0; i < value.length; i++) { System.out.print(value[i] + " "); } }}
代碼結果如下:
未經處理資料:5 1 8 4 15 4 1 5 8 15 1 4 5 8 15 1 4 5 8 15 排序結果:1 4 5 8 15
注意:第一遍快速排序不會直接得到最終結果,只會把比基準數大和比基準數小的數分到基準數的兩邊。為了得到最後結果,需要再次對基準數兩邊的數組分別執行此步驟,然後再分解數組,直到數組不能再分解為止(只有一個資料),才能得到正確結果。
java基礎演算法之快速排序