快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序平均时间复杂度为O(nlogn)级

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

(1)首选选取一个值(如图红色方块标记),以这个值为分界线将数组分为左右两部分。小于该数的放在数组左侧,大于该数的放在数组右侧

(2)对该数左侧数组部分,取一个值作为分界线,再将左部分数组分为两部分。对右部分数组采取同样的操作

(3)重复直到数组完成排序

那么该如何具体操作呢?

首先我们定义两个指针,一个left,指向数组的左侧,一个right,指向数组的右侧。

对于用来做分界线的那个值,选取的方法有很多,为了偷懒我们直接取数组在left位置的数就好。我们用一个数temp来标记它



注意,当我们用temp标记了49后,我们可以认为49那个位置已经空出来了。

接下来开始移动指针:

right指针向左移动,直到遇到的数比temp小,或者rightleft相遇。当遇到比temp小的数时,把right处的值赋给left



ps.你可以认为在执行完这一步后,right所指向的位置已经空出来了

然后让left指针向右移动,直到遇到的数比temp大,或者leftright相遇。当遇到比temp小的数时,把left处的值赋给right



ps.你可以认为在执行完这一步后,left所指向的位置已经空出来了

然后再让right指针向左移动,直到遇到的数比temp小,或者rightleft相遇。再移动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

posted @ 2020-04-21 16:17  maurrinho  阅读(151)  评论(0编辑  收藏  举报