在看快排之前先明白一點:
快排是基於劃分來排的,那麼什麼是劃分?
劃分就是把數據分爲兩組,使所有比關鍵字大的在一邊,所有比關鍵字小的在一邊
劃分演示:
先取一個關鍵值(這裏是隨便取的)
從左往右掃描(這裏圖少了幾張)
左邊的數應該比關鍵值小,右邊要比關鍵值大,記住這條規則
在左邊找到一個比關鍵值大的
然後左邊的掃描停止,從右邊找一個比關鍵值小的
兩兩交換,然後循環掃描直到保持左邊都比關鍵值小,右邊都比關鍵值大
左右掃描的遊標重合的地方就是劃分的分割點
一次劃分結束
然後快排就是再次基礎上不斷的劃分,直到全部有序
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這個編輯器,上傳過一張圖片後,就再也傳不了圖片了,坑