1. 程式人生 > >演算法java——簡單實現快速排序

演算法java——簡單實現快速排序

  • 快速排序
    快速排序是對氣泡排序的改進,它使用分治法的思想,每次迴圈根據指定的基準數,將其他元素分別放置其左右(升序排序,大的放右小的放左),第二次迴圈,以基準數為中心,分為左右兩部分,每部分再通過新的基準數排序…(下邊來個小例子解釋)。

    基準數:一般指定第一個元素為基準數(任意元素都可以作為基準數)。

  • 來個小例子
    對一個int型陣列升序排序(第一個位置為基準數),兩個指標分別指向陣列頭尾:
int[] arr={6,1,2,7,9,3,4,5,10,8};
int frist=0;
int last=9;
  1. 第一次迴圈,frist指向arr[0],last指向arr[9]。首先從右開始尋找小於基準數6的元素,last指向arr[7]=5,frist從左尋找大於基準數6的元素,指向arr[3]=7,交換兩個位置的值
int[] arr={6,1,2,5,9,3,4,7,10,8};
int frist=3;
int last=7;

last繼續向左移動,指向arr[6]=4,frist向右移動,指向arr[4]=9,交換值

int[] arr={6,1,2,5,4,3,9,7,10,8};
int frist=4;
int last=6;

接下來,last繼續向左移動,指向arr[5]=3,frist向右移動,指向arr[5]=3,frist=last,交換基準數與arr[5]=3位置,至此第一次迴圈結束(左邊全部小於基準數6,右邊全部大於6)。

int[] arr={3,1,2,5,4,6,9
,7,10,8}; int frist=5; int last=5;

再將陣列以基準數6為中心,分為兩部分,分別作為新的陣列進行排序:

int[] arr1={3,1,2,5,4};
int[] arr2={9,7,10,8};

2.第二次迴圈

第一部分,新的基準數為3,last,frist分別尋找小於,大於基準數3的元素,交換它們的位置,直至frist=last

//start
int[] arr={3,1,2,5,4,6,9,7,10,8};
int frist=0;
int last=4;

//第一次交換,frist=last基準數與arr[2]=2交換
int[] arr={2,1,3,5
,4,6,9,7,10,8}; int frist=2; int last=2;

再將陣列以基準數3為中心,分為兩部分,分別作為新的陣列進行排序:

int[] arr1={2,1};
int[] arr2={5,4};

第二部分,新的基準數為9,last,frist分別尋找小於,大於基準數9的元素,交換它們的位置,直至frist=last

//start
int[] arr={3,1,2,5,4,6,9,7,10,8};
int frist=6;
int last=9;

//第一次交換,frist=8last=9 arr[9]=8與arr[8]=10交換
int[] arr={2,1,3,5,4,6,9,7,8,10};
int frist=8;
int last=9;

//第二次交換,frist=last=8 基準數9與arr[8]=8交換
int[] arr={2,1,3,5,4,6,8,7,9,10};
int frist=8;
int last=9;

再將陣列以基準數9為中心,分為兩部分,分別作為新的陣列進行排序:

int[] arr1={87};
int[] arr2={10};

3.第三次迴圈

第一部分,新的基準數為2,last,frist分別尋找小於,大於基準數3的元素,交換它們的位置,直至frist=last

//start
int[] arr={2,1,3,5,4,6,9,7,10,8};
int frist=0;
int last=1;

//第一次交換,frist=last基準數與arr[2]=2交換
int[] arr={1,2,3,5,4,6,9,7,10,8};
int frist=2;
int last=2;

往下同理即可。。。

3.遞迴程式碼實現

public class QuickSort {

    public void fristBaseValue(int[] arr, int frist, int last) {
        if (frist > last) return;//遞迴出口
        int i = frist;
        int j = last;
        int temp = arr[frist];
        while (i != j) {
            while (arr[j] >= temp && j > i) {
                j--;
            }
            while (arr[i] <= temp && i < j) {
                i++;
            }
            if (i < j) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
        if (i == j) {
            arr[frist] = arr[i];
            arr[i] = temp;
        }

        fristBaseValue(arr, frist, i - 1);
        fristBaseValue(arr, i + 1, last);

    }
}

遞迴排序過程

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8];frist=0;last=9
[3, 1, 2, 5, 4, 6, 9, 7, 10, 8];frist=0;last=4
[2, 1, 3, 5, 4, 6, 9, 7, 10, 8];frist=0;last=1
[1, 2, 3, 5, 4, 6, 9, 7, 10, 8];frist=0;last=0
[1, 2, 3, 5, 4, 6, 9, 7, 10, 8];frist=0;last=-1
[1, 2, 3, 5, 4, 6, 9, 7, 10, 8];frist=1;last=0
[1, 2, 3, 5, 4, 6, 9, 7, 10, 8];frist=2;last=1
[1, 2, 3, 5, 4, 6, 9, 7, 10, 8];frist=3;last=4
[1, 2, 3, 4, 5, 6, 9, 7, 10, 8];frist=3;last=3
[1, 2, 3, 4, 5, 6, 9, 7, 10, 8];frist=3;last=2
[1, 2, 3, 4, 5, 6, 9, 7, 10, 8];frist=4;last=3
[1, 2, 3, 4, 5, 6, 9, 7, 10, 8];frist=5;last=4
[1, 2, 3, 4, 5, 6, 9, 7, 10, 8];frist=6;last=9
[1, 2, 3, 4, 5, 6, 8, 7, 9, 10];frist=6;last=7
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=6;last=6
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=6;last=5
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=7;last=6
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=8;last=7
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=9;last=9
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=9;last=8
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];frist=10;last=9

測試程式碼

 public void fristBaseValue() {
        int[] arr={6,1,2,7,9,3,4,5,10,8};
        QuickSort sort=new QuickSort();
        sort.fristBaseValue(arr,0,arr.length-1);
    }