Java经典排序之快速排序

快速排序

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。所以快速排序是一个不稳定的排序方法。网上也有基于快速排序的改进方法,时间复杂度有所降低,这里我们不在赘述,有兴趣大家可以去查一下。

首先说一下快排的基本思想,并不难理解。

  • 选择一个基准元素,通常选择第一个元素或者最后一个元素(理论上随便选即可)
  • 通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大
  • 此时基准元素在其排好序后的正确位置
  • 然后通过递归方法分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
代码如下
public class kuaisu {
	public static void main(String[] args) {
		int a[]={2,6,8,4,1,16,24,12};
		QuickSort(a, 0, a.length-1);
		print(a);
		
	}
	public static void QuickSort(int a[],int left,int right) {
		if(left>right) return;
		int pivot=a[left];//将a[left]作为基准
		int i=left;
		int j=right;
		while(i<j) {
			while(a[j]>=pivot&&i<j) {
				j--;                            //从右向左寻找小于pivot的数
			}
			a[i]=a[j];                       //找到小于pivot的数后跳出while循环,将a[j]的数放于a[i]处,即将小于基准pivot的数放在左边
			while(a[i]<=pivot&&i<j) {
				i++;                         //从左向右寻找大于pivot的数
			}                                 
			a[j]=a[i];                      //找到大于pivot的数后跳出while循环,将a[i]的数放于a[j]处,即将大于基准pivot的数放在右边
		}
		a[i]=pivot;                      //当最外层的while循环完毕,必有i==j,此时的i位置即为pivot的正确位置
		QuickSort(a, left, i - 1); // 将right置为i位置左边一位i-1,递归处理i左边的数字序列
	    QuickSort(a, i+1, right);//同上理
		
	}
	public static void print(int a[]) {
		for(int i=0;i<a.length;i++) {
			System.out.print(a[i]+"  ");
		}
		
	}

}

时间复杂度:O(nlog2n)

空间复杂度:O(nlog2n)

不稳定


猜你喜欢

转载自blog.csdn.net/xpdbaba/article/details/79825444