java實現快速排序

 

 一:快速排序的特徵

  1:冒泡排序的改進java

  2:內部交換數據算法

  3:分治+遞歸的思想數組

  4:穩定排序ide

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

 二:算法的總體思路

 

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

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

  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:在算法中陶醉....

相關文章
相關標籤/搜索