快速排序java实现

来源:互联网 发布:华娱无线java 编辑:程序博客网 时间:2024/06/15 03:41

package com.imooc.test;


public class QuickSort {

//main函数,测试用
public static void main(String[] args) {
QuickSort qs = new QuickSort();
int[] a = {12,20,5,16,15,1,30,45,23,9,36,2,6,7};
qs.sort(a);
for (int i : a) {
System.out.print(i+" ");
}
}

//预处理方法
public void sort(int[] a){
int n = a.length;
quickSort(a, 0, n-1);
}

//快速排序
public void quickSort(int[] a ,int left,int right){

int position = partition(a,left,right);

//递归
if (left<position) {//递归结束条件
quickSort(a, left, position-1);
}
if (right>position) {
quickSort(a, position+1, right);
}

}
/**采用分治法、冒泡排序的思想,以数组第一个数为基准数,先从右边扫描,遇到小于基准数的,交换两个数的值,
 * 再从左边扫描,遇到大于基准数的交换数值。最终结果使得基准数(位置变动)左边的数(未排序)都小于它,
 * 右边的数(未排序)都大于它,最后返回基准数的位置(下标)。
 * 
 * @param a 待排序数组
 * @param left 起始点
 * @param right 结束点
 * @return 返回分割点的位置i,位于分割点左边的数都小于a[i],右边的都大于a[i]
 */
private int partition(int[] a, int left, int right) {
int i= left;//开始指针
int j= right;//结束指针
int key = a[left];//取开始的数为基准值,与其他数进行比较

while(i<j){
/*排序的目的是为了使数组成为这样的形式,a[i]<key<a[j]
*但当有a[i]>key或key>a[j]时,要交换他们的值
*所以扫描的时候遇到满足a[i]<key<a[j]这样的数时,并不是排序所关心
*应当移动指针,直到找到a[i]>key或key>a[j]这样的数,
*并交换a[i],key或key,a[j]的值

* */
while(i<j && key<a[j]){//先从右边扫描 key<a[j] 
j--;  //这是正常排序的情况,忽略,并使指针左移
}
if (key>a[j]) {//当发现右边有数比基准数小时,交换它和基准数的值,
swap(a, i, j);
}

while(i<j&&a[i]<=key){//左边开始扫描
i++;
}
if (a[i]>key) {
swap(a,i,j);
}
//右边和左边各扫描一次结束
}

return i;//整个扫描结束,i=j

}


private void swap(int[] a, int i, int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
0 0