快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序平均时间复杂度为O(nlogn)级
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首选选取一个值(如图红色方块标记),以这个值为分界线将数组分为左右两部分。小于该数的放在数组左侧,大于该数的放在数组右侧
(2)对该数左侧数组部分,取一个值作为分界线,再将左部分数组分为两部分。对右部分数组采取同样的操作
(3)重复直到数组完成排序
那么该如何具体操作呢?
首先我们定义两个指针,一个left
,指向数组的左侧,一个right
,指向数组的右侧。
对于用来做分界线的那个值,选取的方法有很多,为了偷懒我们直接取数组在left
位置的数就好。我们用一个数temp
来标记它
注意,当我们用temp
标记了49后,我们可以认为49那个位置已经空出来了。
接下来开始移动指针:
让right
指针向左移动,直到遇到的数比temp
小,或者right
与left
相遇。当遇到比temp
小的数时,把right
处的值赋给left
处
ps.你可以认为在执行完这一步后,right所指向的位置已经空出来了
然后让left
指针向右移动,直到遇到的数比temp
大,或者left
与right
相遇。当遇到比temp
小的数时,把left
处的值赋给right
处
ps.你可以认为在执行完这一步后,left所指向的位置已经空出来了
然后再让right
指针向左移动,直到遇到的数比temp
小,或者right
与left
相遇。再移动left
指针......
重复以上的移动指针操作,直到left==right
,此时left
(或者说right
,反正现在二者相同)所指向的位置就是temp
所该填入的位置
然后把temp
写入该位置,这样就完成了对数组的一次分组。
根据以上过程我们可以写出 如下代码
public int sort(int[] arr,int left,int right){
int temp=arr[left];
while(left<right){
while(left<right && arr[right]>=temp)
right--;
arr[left]=arr[right];
while(left<right && arr[left]<=temp)
left++;
arr[right]=arr[left];
}
arr[left]=temp;
return left;
}
我们可以用一个变量index
来储存此时temp
的位置
int index=sort(arr,left,right);
然后从index
作为分界线,对数组的两侧重复上面的操作,左部分数组的right
设置为index-1
,右部分数组的left
设置为index+1
我们可以写出如下代码:
public void quicksort(int[] arr,int left,int right){
if(arr==null || arr.length==0)
return;
if(left<right){
int index=sort(arr,left,right);
quicksort(arr,left,index-1);
quicksort(arr,index+1,right);
}
}
完整代码:
public class QuickSort {
public void quicksort(int[] array,int left,int right) {
if(array==null || array.length==0)
return;
if(left<right) {
int index=sort(array,left,right);
quicksort(array,left,index-1);
quicksort(array,index+1,right);
}
}
public int sort(int[] array,int left,int right) {
int temp=array[left];
while(left<right) {
while(left<right && array[right]>=temp)
right--;
array[left]=array[right];
while(left<right && array[left]<=temp)
left++;
array[right]=array[left];
}
array[left]=temp;
return left;
}
public static void main(String[] args) {
// 测试数据
int[] array = { 49, 38, 65, 97, 23, 22, 76, 1 };
QuickSort QS=new QuickSort();
QS.sort(array, 0, array.length-1);
for(int i:array)
System.out.print(i+" ");
}
}
输出结果:
1 22 23 38 49 65 76 97