快速排序:

  1.实现

  2.复杂度

 

1.java 快速排序实现:

 

package com.sort;

import java.util.ArrayList;

public class QuickSort {
	private int getMiddle(ArrayList<Integer> list,int start,int end){
		int i = start;
		int j = end;
		Integer temp = list.get(start);//需要中间变量,或是每次替换时进行twiceswap
		while(i<j){
			while(temp<list.get(j)&&i<j)
				j--;
			if(i<j){
				list.set(i, list.get(j));
				i++;
			}
			while(list.get(i)<temp&&i<j)
				i++;
			if(i<j){
				list.set(j, list.get(i));
				j--;
			}
		}
		list.set(i, temp);//最后i=j
		return i;
	}
	
	private void quickSort(ArrayList<Integer> list,int start,int end){
		if(start<end){
			int middle = getMiddle(list, start, end);
			quickSort(list, start, middle-1);
			quickSort(list, middle+1, end);
		}
	}
	
	public void quickSort(ArrayList<Integer> list){
		this.quickSort(list, 0, list.size()-1);
	}
	
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(7);
		list.add(2);
		list.add(3);
		list.add(8);
		list.add(3);
		list.add(6);
		list.add(10);
		list.add(100);
		list.add(9);
		list.add(77);
		list.add(34);
		list.add(20);
		new QuickSort().quickSort(list);
		QuickSort.print(list);
	}
	
	public static void print(ArrayList<Integer> list){
		for (Integer integer : list) {
			System.out.print(integer+",");
		}
		System.out.println();
	}

}

1.实现中注意的事情,至少是我碰到的,需要一个中间变量进行比较,或是在交换的时候,进行两次交换,就是两个值互换位置 。可以尝试这样的用例100 77 34 20.

2.每一次的拆分,就已经确定了一个位置(并且将值分为两半,一半大,一半小),不要将middle也带入下一次的排序

 

 

2.快速排序复杂度分析:

 

快速排序的最佳情况:分割递归为平衡树,

这样分解次数为log2n

在第i次分解,需要比较n/(2^i)

通过运算推导

T(1) = 0;
T(n) <= 2T(n/2) + n;
T(n) <= 2(2T(n/4) + n/2) + n=4T(n/4)+2n
T(n) <= 8T(n/8)+3n
T(n) <= (log2n)^2T(1)+(log2n)n (因为分解log2n次)
T(n) <= nlog2n

 所以快速排序最佳复杂度为nlog2n

 

快速排序的最差情况:序列为正序或逆序,在分割后产生斜树,

这样要分解次数为n-1次,

在第i次分解后,需要比较n-i次

通过运算推导

n-1+n-2+n-3....+1=n(n-1)/2

 索引快速排序的最差复杂度为n^2

 

 

快速排序的平均复杂度:

设分解的关键字为k,则(1<=k<=n)

通过运算推导为nlogn