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