快速排序快速搞定
一次完整的排序过程:
1.在要排序的的数中随机的选出一个数值为基准数,与最后面的一个数值进行交换
2.设置交换区间,初始交换区间的长度为0
3.从左向右遍历,将遍历的当前值与选出的基准数比较,如果当前值小于等于基准数,则将当前值与基准数进行交换,如果大于基准数则继续向后遍历
4.当所有的元素都大于基准数的时候,将基准数与区间后面的第一个元素进行交换,至此完成遍历
最差的情况是:每次划分得到一个空数组(每次确定的基准都是最大或者最小的),进而在递归调用中,尽管一个数组递归调用没有事情做,另一个递归调用必须对n-1个元素而不是n/2个元素进行排序。结果就是 进行n层递归调用而不是logn层。因此坏的调用是O(n^2) ,最好的时候是(nlogn),归并排序总是O(nlogn)
package jianzhioffer;
/*
* 快速排序的操作
* 对数组实现快速排序有三种方式
* 1.选择第一个数作为基数
* 2.随机选择一个数作为基数(同样的,把那个随机数与第一个数据进行交换就行)
* 3.选择中间数作为基数(最好是这种方式,将start mid end 三个值选出来之后进行排序,保证这三个位置有序,选择中间的值作为基数,放到start+1的位置上,这样可以从start+2的位置向右移动,从last-1的位置开始向左移动)
*/
public class quickSort {
public static void main(String[] args) {
int[] array = new int[] {10,6,3,8,33,27,66,9,7,88};
System.out.println(array.length);
quickSort(array, 0, array.length-1);
for (int i : array) {
System.out.print(i+" ,");
}
}
public static void quickSort(int[] array,int start,int end) {
if(start<end) {
int division=adjust(array, start, end);
quickSort(array, start, division-1);
quickSort(array, division+1, end);
}
}
/*
* 选择第一个数作为基准
*/
public static int adjust(int[] array,int start,int end) {
int temp=array[start];
int left=start;
int right=end;
while(left<right) {
while(left<right&&temp<array[right]) {// 从右边开始小于基准的数来填,大于基准就找下一个
right--;
}
if(left<right) {
array[left]=array[right];// 将右边小于基准的值填充到坑中
left++;// 左边+1
}
while(left<right&&temp>array[left]) {// 从左边开始大于基准的值来填,小于基准的值就找下一个
left++;
}
if(left<right) {
array[right]=array[left];
right--;
}
}
array[left]=temp;// 循环退出时候,left和right相同,基准填到这个坑中
return left;// 返回分割的位置
//分割位置作为前一个数组的最后位置和后一个数组的第一个位置
}
}
https://www.cnblogs.com/l199616j/p/10597245.html
https://blog.csdn.net/morewindows/article/details/6684558