快速排序介绍及实现

        输入为n个数,快速排序期望时间复杂度为 O(nlgn),最坏时间复杂度为 O(n^2)
  1. 算法过程

        输入为n个数据的数组A[n],快速排序试图找到一个中间数据,把该数据放置中间,这样就分成了两个子数组,左边的子数组都小于中间数,右边的都大于中间数,用同样的方法对子数组进行排序,直到数组全部排序完成。

        这里涉及了一个递归的思想在里面。算法的关键也是如何在一组数据中找到该中间值

        提供的思路如下: 记输入数组为A[low,high]

        (1)选取数组最后一个数据A[high-1]为参照值index,设置两个lable变量i,j。初始值i为low-1,j为low。

        (2)以j为循环变量,从0开始遍历数组至倒数第二位A[high-2],会出现两种情况:    

                   A[j]>index,此时不作交换数值操作,j++,遍历继续

                   A[j]<=index,交换A[j]和A[++i],j++,遍历继续

      (3)遍历结束后,交换index与A[i+1],返回i+1,i+1即为中间值的下标记为mid,那么原来A[n]的数组则被分成A[0...mid-1]和A[mid+1,n-1]两个子数组

        (4)递归调用,直到low>=high,表示数组所有元素都排序完成。


    2.代码实现

import java.util.Arrays;

public class QuickSort {
	public static void main(String[] args) {
		int[] a=new int[] {2,5,36,15,9,6,45,36};		//随机给定一个无序数组
		int[] b=quickSort(a,0,a.length);
		System.out.println(Arrays.toString(b));
	}
	
	//找出中间值,并返回其下标
	public static int partition(int[] a,int low, int high) {
		//标记值初始化
		int i=low-1;
		int j=low;
		int index=a[high-1];

		//开始遍历
		while(j<high-1) {
			if(a[j]>index) 
				j++;
			else {
				int temp=a[++i];
				a[i]=a[j];
				a[j++]=temp;
			}
		}
		//遍历结束后交换中间值
		a[high-1]=a[++i];
		a[i]=index;
	
		//返回中间值下标
		return i;
	}
	
	//快速排序
	public static int[] quickSort(int[] a,int low,int high) {
		if(low<high-1) {
			int mid=partition(a,low,high);
			//递归调用
			quickSort(a,low,mid);
			quickSort(a,mid,high);
		}
		return a;
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值