【Java數據結構與算法】快速排序

快速排序

基本介紹

快速排序(Quick sort)是對冒泡排序的一種改進。基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按照此方法對這兩部分數據分班進行快速排序。整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

快速排序算法的過程

快速排序

代碼實現

package sort;

import java.text.SimpleDateFormat;
import java.util.Date;

public class QuickSort {
    public static void main(String[] args) {
        //int[] arr = {-9,78,0,23,-567,70};
        //測試快速排序速度,給80000個數據,測試
        //創建一個80000個隨機的數組
        int[] arr1 = new int[80000];
        for (int i = 0;i < 80000;i ++) {
            //會生成一個[0,8000000]的數
            arr1[i] = (int)(Math.random() * 8000000);
        }
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat1.format(date1);
        System.out.println("排序前的時間:" + date1Str);
        //測試快速排序
        quickSort(arr1,0,arr1.length-1);
        Date date2 = new Date();
        String date2Str = simpleDateFormat1.format(date2);
        System.out.println("排序後的時間:" + date2Str);
    }
    public static void quickSort(int[] arr,int left,int right) {
        int l = left;//左下標
        int r = right;//右下標
        //pivot中軸
        int pivot = arr[(left + right) / 2];
        //臨時瀕臨,作爲交換時使用
        int temp = 0;
        //whlie循環的目的是讓比pivot小的,放到左邊,反之放到右邊
        while (l < r) {
            //在pivot達到左邊一直找,找到大於等於pivot的值,才退出
            while (arr[l] < pivot) {
                l += 1;
            }
            //在pivot達到右邊一直找,找到小於等於pivot的值,才退出
            while (arr[r] > pivot) {
                r -= 1;
            }
            //如果l>=r,說明pivot的左右倆的值,已經按照規則排完,左邊小於pivot,右邊大於
            if (l >= r) {
                break;
            }
            //交換
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //如果交換之後,發現arr[l] == pivot值,則r-1,前移
            if (arr[l] == pivot) {
                r -= 1;
            }
            //如果交換之後,發現arr[r] == pivot值,則l+1,後移
            if (arr[r] == pivot) {
                l += 1;
            }
        }
        //如果l == r,讓l++,r--,否則會出現棧溢出
        if (l == r) {
            l += 1;
            r -= 1;
        }
        //向左遞歸
        if (left < r) {
            quickSort(arr,left,r);
        }
        //向右遞歸
        if (right > l) {
            quickSort(arr,l,right);
        }
    }
}

筆記源自:韓順平數據結構與算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章