package quicksort;
/**
* 快速排序是一种划分交换排序,采用了分治策略,时间复杂度为O(NlogN),总共需要logN次选取基准数,整个是一个树结构,每一层的复杂度是O(N),所以总共是O(NlogN)
* 思想:
* 1、先从数列中取出一个数作为基准数
* 2、将比这个数大的数全都放到它的左边,比它小的全都放它右边
* 3、再对左右区间重复第二步,直到各区间只有一个数
* @author AbuGe
* 例:
* 0 1 2 3 4 5 6 7 8 9
* 72 6 57 88 60 42 83 73 48 95
* 将取值比喻成挖坑
*步骤:
*1、选择基准数,挖个坑,这里用0个元素,确定左右区间i = R, j = L
*2、从后向前遍历,如果比基准数大则j--,直到比基准数小(前提是i < j),找到后将j对应的值赋给挖的坑,这个j对应的值就出现了新的坑,将i++,继续下个数的比较
*3、从前向后遍历,如果比基准数小则i++,直到比基准数大(前提是i < j),这个j对应的值就出现了新的坑找到后将i对应的值赋给挖的坑,将j--,继续下个数的比较
*4、重复2和3步,直到i == j,将基准数填入到a[i]中
*/
public class QuickSortDemo
{
public static int adjustArray(int array[], int left, int right)
{
//第一步挖坑,确定基准数与基准区间
int i = left;
int j = right;
int base = array[i];
//循环排序
while(i < j)
{
//第二步从后向前比较
while(i < j && base <= array[j])
{
j--;
}
//确定是否是由于base <= array[j]引发的上一个while的退出,如果是则将a[j]填入上一次的坑
if(i < j)
{
array[i] = array[j];
i++;
}
//第三步从前向后比较
while(i < j && base >= array[i])
{
i++;
}
//确定是否是由于base <= array[j]引发的上一个while的退出,如果是则将a[i]填入上一次的坑
if(i < j)
{
array[j] = array[i];
j--;
}
}
//此时i == j,执行第四步
array[i] = base;
return i;
}
//运用分治和递归的方法进行快速排序,完成递增排序
public static void quickSort(int[] array, int left, int right)
{
if(left < right)//这个判断至关重要,这是递归判断的出口,这个必须有!!!!!!!!!!!!!
{
//先挖坑填数,将数组分成两部分,获得分区下标i
int i = adjustArray(array, left, right);
//左区间递归调整
quickSort(array, left, i - 1);
//右区间递归调整
quickSort(array, i + 1, right);
}
}
public static void main(String[] args)
{
int[] array = {72, 6, 57, 88, 60, 42, 83, 73, 48, 95};
int len = array.length;
System.out.print("排序前:");
for(int a : array)
{
System.out.print(a + " ");
}
quickSort(array, 0, len - 1);
System.out.println();
System.out.print("排序后:");
for(int a : array)
{
System.out.print(a + " ");
}
}
}
阿布学排序之快速排序
最新推荐文章于 2014-07-16 21:44:19 发布