1.快速排序的简单介绍
算法思想:基于分治的思想,是冒泡排序的改进型,首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率),然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前部分开始扫描,发现有元素大于基准点的值,就交换low和high的值,如此往复循环,知道low>=high然后把基准值放在low这个位置,依次排序就完了。以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序是该数组就自然有序了。
2.快速排序算法的特点
- 快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较
- 最坏情况是每次划分选取的基准都是当前无序区中关键字最小的记录,划分的结果是基准左边的子区间为空或右区间为空,而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n);
- 在最好情况下,每次划分所取的基准都是当前无序区的中值,在划分的结果是基准的左,右两个无序子区间的长度大致相等。总的关键字比较次数O(n*logn)
- 尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快索爱徐亦因此而得名。它的平均时间复杂度为nlogn;
我们为了简单起见,每次选取分组的第一个元素为基准值
如选取5,首先从后面开始high比temp小,所以把high的值赋给low
然后low加一
直到low大于temp,把low给high,然后high减一;
以此类推
代码如下
class Solution{
public static void main(String[] args){
int[] arr={5,6,1,2,6,9,10,500,100,12};
int low=0;
int high=arr.length-1;
quickSort(arr,low,high);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int low,int high){
if(low<high){
int i=low;
int j=high;
int pivot=arr[low];
while(i<j){
while(i<j){//直到high比pivot小,把high赋给low跳出;
if(arr[j]<pivot){
arr[i]=arr[j];
i++;
break;
}else{
j--;
}
}
while(i<j){//直到low比pivot大,把low赋给high跳出;
if(arr[i]>pivot){
arr[j]=arr[i];
j--;
break;
}else{
i++;
}
}
}
arr[i]=pivot;//把基准值赋给中值
quickSort(arr,low,i-1);//下一次左分组排序
quickSort(arr,i+1,high);//下一次右分组排序
}
}
}