转载自:http://blog.youkuaiyun.com/lemon_tree12138/article/details/50622744
1.基本思想:
分治思想,对冒泡排序改进。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.步骤:
1)获得待排序数组a
2)选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准
3)将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边
4)从第3步获得的两个子数组sub1跟sub2
5)判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行
3.复杂度分析:
如果我们在选取基准p的时候,每次选取的都是当前数组中最小的一个元素,那么每次划分都只是让数组中的元素少1(被筛选出来的那个元素当然有序),这样一来就需要反复遍历数组导致复杂度变成了O(n2)。
如果我们在选取基准p的时候,每次选取的都是当前数组中最中间的一个元素(是中位数,而不是元素位置上的中间),那么每次划分都把当前数组划分成了长度相等的两个子数组,这样一来复杂度变成了O(nlog2n)。
4.代码
//快速排序
//打印排序的序列
public static void quickSort(int[] arr){
sortCore(arr,0,arr.length-1);
StringBuilder num=new StringBuilder();
for(int i:arr){
num.append(i+" ");
}
System.out.println(num.toString());
}
//核心排序算法
public static void sortCore(int[] arr,int startIndex,int endIndex){
if(startIndex>=endIndex){
return;
}
int boundary=boundary(arr,startIndex,endIndex);
sortCore(arr,startIndex,boundary);
sortCore(arr,boundary+1,endIndex);
}
//左右两区部分数据 交换并返回分界点
private static int boundary(int[] arr, int start, int end) {
int standard=arr[start];//定义标准,即最左元素
int leftIndex=start;//左指针
int rightIndex=end;//右指针
while(leftIndex<rightIndex){
while(leftIndex<rightIndex && arr[rightIndex]>=standard){
rightIndex--; //从右向左查找
}
arr[leftIndex]=arr[rightIndex];//小于基准的移到左端
while(leftIndex<rightIndex && arr[leftIndex]<=standard){
leftIndex++;//从左往右查找
}
arr[rightIndex]=arr[leftIndex];//大于基准的移到右端
}
arr[leftIndex]=standard;//基准位置不再变化,基准值来到中间
return leftIndex;
}

被折叠的 条评论
为什么被折叠?



