java實現快速排序

 

 一:快速排序的特徵

  1:冒泡排序的改進

  2:內部交換數據

  3:分治+遞歸的思想

  4:穩定排序

  5:時間複雜度爲:O(n*logn)

 二:算法的整體思路

 

  1:原始數據:12 11 6 87 23 8 54 

  2:第一次定義  key=12  以key值爲參考

  3:第一趟交換後大致爲: 8 6 11 12 54 87 23  (把比12小的交換到左邊,大的交換到右邊)

  4:根據以上的思想:把左邊和右邊的數據分別看着一組數據

       左邊的數據: 8 6 11

       key=8

       第一趟比較後可以得出:6 8 11   (比key小的放左邊,大的放右邊)

 5:右邊的數據:54 87 23 

    key=54 

   第一趟比較後可以得出:23 54 87

 ...................................................... 

按照如上的思想:遞歸的執行就可以得到升序的數據.

 三:程序設計思想

  1:定義key值

  2:定義左邊指針left、右邊指針 right  

  3:右邊->左邊遍歷:如果當前的值比key值小,右邊和左邊交換

  4:左邊->右邊遍歷:如果左邊的值比key大,左邊和右邊交換

  5:當左邊的指針和右邊的指針指向同一個地址,遍歷終止

  6:遞歸調用

 四:代碼實現如下:

 


 package basic.suanfa;

/**

 * java版快速排序

 * @author zl

 *

 */

public class KuaiPaiZl {

   public void qSort(int[] A,int start,int end){

   //遞歸終止條件 

if(start>=end)

  return;

//設置變量  

int key=A[start];//將數組的第一個值設置爲Key值

   //設置指針變量,從左邊----向右移動

int pointRight=start;

   //設置指針變量,從右邊--向左移動

int pointLeft=end;

//交換數據的橋樑變量

int temp;

//開始循環

while(start!=end){

//從右邊->左找一個比:key值小的數

//如果沒有找到比:key小的值,指針向:右邊移動

while((start!=end)&&A[pointLeft]>key){

pointLeft--;

}

//如果遍歷完整個數組都未找到:就說明key值右邊的值已經都比他大了

if(pointLeft==pointRight)

break;

//找到比key小的數,進行交換

temp=A[pointLeft];

A[pointLeft]=A[pointRight];

A[pointRight]=temp;

pointRight++;

//從左邊->右邊找一個比key大的數

while((start!=end)&&A[pointRight]<key){

pointRight++;

}

if(pointRight==pointLeft)break;

//找到比key大的數,進行交換

temp=A[pointRight];

A[pointRight]=A[pointLeft];

A[pointLeft]=temp;

pointLeft--;

}

//遞歸調用

qSort(A, start, pointRight-1);

qSort(A, pointRight+1, end);

}

//測試函數

public static void main(String[] args){

   int[] A={15,8,7,9,3,5,6,4,7,10,41,50,27,10};

KuaiPaiZl kp=new KuaiPaiZl();

kp.qSort(A, 0, A.length-1);

 System.out.println("排好序的數組爲:");

 for(int i=0;i<A.length;i++){

System.out.println(A[i]+"\t");

}

}

}

 

 


ps:在算法中陶醉....

 

 

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