快速排序

在看快排之前先明白一點:
快排是基於劃分來排的,那麼什麼是劃分?
劃分就是把數據分爲兩組,使所有比關鍵字大的在一邊,所有比關鍵字小的在一邊

劃分演示:
這裏寫圖片描述

先取一個關鍵值(這裏是隨便取的)
這裏寫圖片描述
從左往右掃描(這裏圖少了幾張)
左邊的數應該比關鍵值小,右邊要比關鍵值大,記住這條規則
這裏寫圖片描述
在左邊找到一個比關鍵值大的
這裏寫圖片描述
然後左邊的掃描停止,從右邊找一個比關鍵值小的
這裏寫圖片描述
這裏寫圖片描述
兩兩交換,然後循環掃描直到保持左邊都比關鍵值小,右邊都比關鍵值大這裏寫圖片描述
左右掃描的遊標重合的地方就是劃分的分割點
這裏寫圖片描述
一次劃分結束
然後快排就是再次基礎上不斷的劃分,直到全部有序

package sort;

import org.junit.Test;

public class QuickSort
{
    private int [] arr = { 88 , 33 , 56 , 66 , 99 , 11 , 77 } ;

    //將指定範圍數據(left->right) 按照指定值劃分(value),小的放左,大的放右
    public int divide ( int left , int right , int value )
    {
        int l = left - 1 ;
        int r = right + 1 ;

        while ( true )
        {
            //循環結束代表在左邊找到比關鍵字大的數,準備交換
            while ( l < right && arr [++l] < value );

            //循環結束代表在右邊找到比關鍵字小的數,準備交換
            while ( r > left  && arr [--r] > value ) ;  

            //如果l r重合代表整個數組數據都被循環過了,跳出循環
            if ( l >= r )
            {
                break ;
            }

            //交換數據
            int temp = arr [l] ;
            arr [l] = arr [r] ;
            arr [r] = temp ;
        }

        return l ;//返回重合點
    }

    public void sort ()
    {
        recsort ( 0 , arr.length - 1) ;
    }

    //使用遞歸來反覆劃分,最後變爲有序
    public void recsort ( int left , int right )
    {

        if ( right - left <= 0 )
        {
            return ;
        }

        int value = arr [right] ;//關鍵值
        int p = divide ( left , right , value ) ;//p 分割點下標

        recsort ( left , p - 1 ) ;
        recsort ( p , right ) ;
    }

    //遍歷
    public void display ()
    {
        for ( int i = 0 ; i < arr.length ; ++ i )
        {
            System.out.print ( arr [i] + " " );
        }
        System.out.println ();
    }

}

不得不吐槽一下csdn這個編輯器,上傳過一張圖片後,就再也傳不了圖片了,坑

發佈了43 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章