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

 

 

点赞