排序算法之快速排序

Posted by DH on August 6, 2017

思想

快速排序是排序算法中比较有名的一个,他的主要思想是,用一趟排序找到一个数,将数组分组两个部分,左边的部分都比这个数大,右边的部分都比这个数小。

然后再分别对左右两边的数组进行此种操作,直到被分割的数组长度是1,整个数组就达到了有序。

例子

一般,我们选择数组的第一个数作为基准进行比较,左边的比这个数小,右边的比这个数大。

例子,如下图所示,开始从右边扫描,直到一个数比基准数小,就交换这两个数的位置,接下来就从左边开始扫描,找到一个数比基准数大,就交换这两个数, 直到左右两个指针重合。

代码

package test;

import java.util.Arrays;

public class QuickSort {
	
	public  static void main(String [] args){
		
		
		QuickSort sort = new QuickSort();
		
		int [] array = {1, 3, 4, 5, 2, 6, 9, 7, 8, 0};
		
		sort.quickSort(array, 0, array.length - 1);
		
		System.out.println(Arrays.toString(array));
		
		
	}
	
	
	public void quickSort(int [] array,int left,int right){
		
		if (left < right) {
			// 分割数组,找到下次分割的基准数
			int base = division(array, left, right);
			
			// 对左边的数组进行快排
			quickSort(array, left, base - 1);
			
			// 对右边的数组进行快排
			quickSort(array, base + 1, right);
		}
		
	}
	
	
	public int division(int [] array,int left,int right){
		
		
		int base ;
		
		while(left < right){
			// 从右边开始进行比较
			while(array[left] < array[right]){
				right --;// 右边的数比基准数大,右指针前移
			}
			// 右边的数比基准数的小,交换两个数
			base = array[left];
			array[left] = array[right];
			array[right] = base;
			
			// 从左边开始比较
			while(array[left] < array[right]){
				left ++;// 左边的数比基准数小,左指针右移
			}
			// 左边的数比基准数大,交换两个数
			base = array[left];
			array[left] = base;
			array[left] = array[right];
			array[right] = base;
		}
		
		return left;
	}
	
}


复杂度分析

最好时间复杂度:O(nlogn);

最坏时间复杂度:O(n2);

平均时间复杂度:O(nlogn);

空间复杂度:O(1)