一:快速排序的特徵 |
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:在算法中陶醉....