面试必备,快速排序

一 原理

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
示例:

1 对”6 1 2 7 9 3 4 5 10 8”这10个数进行排序。将这个组数存入数组arr,选择数组的第一个元素”6”作为基准,下标为0;分别从左边右边向中间找:

    左边:如果后一个元素比6小,下标加1,继续向后找,直到找到大于6的元素才停止;
    右边:如果后一个元素比6大,下标减1,继续向前找,直到找到小于6的元素才停止;

执行完以上操作,若果左边的下标比右边的下标小,交换左右下标对应元素的位置,继续重复以上操作继续查找,直到左边的下标等于右边的下标。

2 当左边的下标和右边的下标指向同一个元素时(即左边的下标等于右边的下标=j),交换第一个元素和该元素的位置;原来的数组的顺序就为:3 1 2 5 4 6 9 7 10 8。

3 递归

      6左边的数:3 1 2 5 4,执行1),2)操作后,变为:1 2 3 5 4;
      再对3右边的数:5 4执行1),2)操作后,变为1 2 3 4 5; 
 	  6右边的的数处理方法和6左边的数处理方法相同,变为7 8 9 10。

4经过上述三步处理这10个数的顺序为:1 2 3 4 5 6 7 8 9 10。

二 Java代码实现


public class QuickSort11 {
	
	public static void main(String[] args) {
		
		
		int[] arr = {5,3,12,34,22,3,5,6,8,3,2,4,0,44,123,44};
		quickSort(arr,0,arr.length-1);
		for (int i = 0; i < arr.length; i++) {
			
			System.out.println(arr[i]);
		
		}
	}

	private static void quickSort(int[] arr, int min, int max) {
		
		if(min>max){
			return;
		}
		int i=min;
		int j=max;
		int temp;//用于交换的中间变量
		//定义数组的第一个元素为基准
		int flag=arr[min];
		
		while(i<j){
			
			//看j(右边), 依次往左边递减
			while(flag<=arr[j]&&i<j){
				j--;
			}
			
			//看i(左边),依次往右边递增
			while(flag>=arr[i]&&i<j){
				i++;
			}
			
			/*
			 * 右边找到比flag小的数停下
			 * 左边找到比flag大的数停下
			 * 如果满足i<j条件,交换位置继续循环查找
			 * 直到i=j,跳出循环
			 */
			if(i<j){
				temp=arr[j];
				arr[j]=arr[i];
				arr[i]=temp;
			}
		}
		
		//将基准arr[0]与i的位置交换
		arr[min]=arr[i];
		arr[i]=flag;
		//左边的数比flag小,右边的数比flag大,左右两边的数大小无序
		//递归,对flag左边的数排序
		quickSort( arr, min, j-1);
		//递归,对flag右边的数排序
		quickSort(arr, j+1, max);
	}
}

快排的性能在所有排序算法里面是最好的,数据规模越大快速排序的性能越优。快排在极端情况下会退化成
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值