java数据结构与算法分析:快速排序(图文并茂)

快速排序(默认升序)

快速排序,是一种速度最快、效率最高的排序算法。主要是由于非常精炼和高度优化的内部循环。
时间复杂度为:O(nlogn)~O(n^2)
空间复杂度为:O(logn)~O(n)

目标

将一个数组按照从大到小的顺序重新排列。

思路

在需要排序的数组中选择一个基准值key(一般选择第一个元素),通过第一次循环之后,将数组分为两部分:比key大的,放在key的右边;比key小的,放在key的左边;然后左右各用递归,重复上述规则进行排序,以此类推知道排序完成。

  • 定义i=0,j=arr.length-1,key=arr[i],即在第一次循环中,key值一直等于arr[0]的值;
  • 从后往前找,遇到比key大的值不管,继续往前找,直到遇到比key小的值,就使该值和key值交换,并且i++;
  • 从前往后找,遇到比key小的值不管,继续往后找,直到遇到比key大的值,就使该值和key值交换,并且j–;
  • 第一次循环结束
  • 同样的道理,按照上述规则,进行下一次循环,知道i=j了,说明key值放在了它应该在的位置,再对key值左边和右边的值进行排序;
  • 直到排序完成。

画图解释

java数据结构与算法分析:快速排序(图文并茂)_第1张图片
代码示例:

public class QuickSort {
	public static void main(String[] args) {
		int data[]=new int[] {2,3,5,6,8,9,0,1,4,7};
		sort(data,0,data.length-1);
		printArray(data);
	}

	public static void sort(int[] arr,int low,int high) {
		if (low > high) {
            return;
        }
		int i=low;
		int j=high;
		int key=arr[i];
		while(i<j) {//一定不要忘记结束循环的条件,不然就出错误了,我在这里查错查了好久。
			while(i<j&&arr[j]>key) {
				j--;
			}
			if(i<j) {
				 int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
				i++;
			}
			while(i<j&&arr[i]<key) {
				i++;
			}
			if(i<j) {
				 int te=arr[j];
				arr[j]=arr[i];
				arr[i]=te;
				j--;
			}
		}
		    arr[i]=key;
			sort(arr,low,i-1);//递归
			sort(arr,i+1,high);//递归
	}

	
	public static void printArray(int[] arr) {
		for(int x=0;x<arr.length;x++) {
			System.out.print(arr[x]+" ");
		}
	}
}

运行结果:

0 1 2 3 4 5 6 7 8 9 

你可能感兴趣的:(Java数据结构与算法分析)