快速排序之遞歸實現

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

簡單來說就是找基準。使基準前面的數都比它大(小),後面的數都比它小(大)。再採用分治思想將問題一次次分爲規模較小的子問題,通過這樣進行排序,最終實現整個序列的有序。
快速排序(遞歸)時間複雜度:好情況:0(nlog2n),壞:O(n2).不穩定
空間複雜度:O(log2n)

1,找基準point
首先將array[low]作爲基準,將比它大的放在後面,小的放在它前面
在這裏插入圖片描述

private static int partion(int[] array, int low, int high) {
		
		int point = array[low];
		while(low < high){
			while(low < high && array[high] >= point){
				high--;
			}
			if(low >= high){
				break;
			}else{
				array[low] = array[high];
			}
			
			while(low < high && array[low] <= point){
				low++;
			}
			if(low >= high){
				break;
			}else{
				array[high] = array[low];
			}
		}
		array[low] = point;
		return low;//返回基準的下標
 
	}

就這樣進行第一次快速排序

通過這個基準將問題分成兩個規模不同的子問題

2,再分別對兩個子問題進行快速排序

private static void Qsort(int[] array, int low, int high) {
		int point = partion(array,low,high);
		if(point > low+1){//對左邊進行快排
			Qsort(array,low,point);
		}
		if(point < high-1){//對右邊進行快排
			Qsort(array,point+1,high);
		}
	}

3、主函數調用

public static void main(String[] args) {
		int[] array={4,3,5,6,234,56,2};
		quickSort(array);
		System.out.println(Arrays.toString(array));
	}
 
	private static void quickSort(int[] array) {
		Qsort(array,0,array.length-1);
	}

所以Java遞歸實現快速排序的代碼如下:

import java.util.Arrays;

/**
 * 描述: 快排遞歸實現
 *
 * @author: JR
 * @date: 2019/10/10 11:55
 **/
public class TestQuickSort {
    public static void main(String[] args) {
        int[] array={4,3,5,6,234,56,2};
        quickSort(array);
        System.out.println(Arrays.toString(array));
    }

    private static void quickSort(int[] array) {
        Qsort(array,0,array.length-1);
    }

    private static void Qsort(int[] array, int low, int high) {
        int point = partion(array,low,high);
        if(point > low+1){//對左邊進行快排
            Qsort(array,low,point);
        }
        if(point < high-1){//對右邊進行快排
            Qsort(array,point+1,high);
        }
    }

    private static int partion(int[] array, int low, int high) {
        int point = array[low];
        while(low < high){
            while(low < high && array[high] >= point){
                high--;
            }
            if(low >= high){
                break;
            }else{
                array[low] = array[high];
            }

            while(low < high && array[low] <= point){
                low++;
            }
            if(low >= high){
                break;
            }else{
                array[high] = array[low];
            }
        }
        array[low] = point;
        return low;//返回基準的下標
    }
}

運行結果如下:
在這裏插入圖片描述

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