算法笔记(5)-快速排序

快速排序

快速排序是分治算法的一种,是应用最广泛的算法。

 

算法描述

(1)选取一个元素作为基准元素。

(2)将数组分成两个部分,左边的元素都比基准元素小,右边的元素都比基准元素大。

(3)在左右两部分再重复步骤1~2,直到数组有序。

 

算法实现java

package algorithm.sort;


/**
 * @author kaichen
 * */
public class Quick {
	
	public static void sort(int[] arr, int low, int high){
		
		if(low <= high){
			int idx = partion(arr, low, high);
			sort(arr, low, idx-1);
			sort(arr, idx+1, high);
		}
		
	}

	private static int partion(int[] arr, int low, int high) {
		
		int pivot = arr[low];
		
		while(low < high){
			while(high > low && arr[high] >= pivot){
				high--;
			}
			arr[low] = arr[high];
			
			while(low < high && arr[low] <= pivot){
				low++;
			}
			arr[high] = arr[low];
		}
		arr[low] = pivot;
		return low;
	}
	
}

快速排序注意点

(1)别越界,如果基准元素是最小或者最大元素,要注意扫描指针越界。测试条件low==high是多余的,因为切分一个元素不可能比自己小。

(2)注意终止循环的条件。

(3)终止递归的条件

 

改进版本

快速排序还有很多改进版本,详情请看《算法》

 

快速排序时间复杂度

最好时间复杂度是O(n*logn), 平均时间复杂度是O(n*logn) , 最坏时间复杂度是O(n^2)

 

稳定性

不稳定

你可能感兴趣的:(算法)