快速排序

快速排序

介绍:

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


原理:

1.分解

初始时将数组分解为以选定的基准为分界线的两个数组:
a.大于或等于基准的数组
b.小于或等于基准的数组

			while(left<right) {
				 //先看右边,依次往左递减
		          while (list[right]>=list[stand]&&left<right) {
		              right--;
		          }
		          //再看左边,依次往右递增
		          while (list[left]<=list[stand]&&left<right) {
		              left++;
		          }
		          //如果满足条件则交换
		          if (left<right) {
		             swap(list,left,right);
		          }
			}		

2.求解

通过递归算法求解左右两边的两个数组

			//递归求解左半边数组
			quicksort(list,low,right-1);
			//递归求解右半边数组
			quicksort(list,right+1,high);

步骤:

1.假设有一个随机数列:{1,6,8,9,2,4,3,5,7}
2.选定一个基准(可以是数组中的任意一个元素,一般用数组的第一个或者最后一个).这里选用最后一个元素7.
3.将最左边的数字标示为做标记left最右边的数列标示为右标记right.
4.准备工作就绪,接下来进行排序:右标记开始向左移动,左标记不动,当右标记遇到小于或等于基准7的数时停止移动,换成左标记向右移动,右标记不动,当左标记遇到大于或等于基准7的数时停止移动,交换左右标记指向的数的值。然后右标记继续移动……根据以上规律,当左右标记的值相等时,停止移动,将基准的值与左右标记指向的值交换。这样就得到以选定的基准为分界线的左右两边:左边小于或等于基准,右边大于或等于基准.
5.利用递归算法分别求解左右两边,最后将等到排好序的原数列.


代码:

public class QuickSort {
	public static void main(String[] args) {	
		int[] arr = {1,6,8,9,2,4,3,5,7};
		quicksort(arr, 0, arr.length-1);
		for (int i = 0; i < arr.length; i++) {
          System.out.print(arr[i]);
          System.out.print(" ");
		}
	}
	public static void quicksort(int[] list,int low,int high) {
		if(low<high){
			int stand = low; //基准
			int left = low;
			int right = high;
			//把数组分成左右两边,左边小于或等于基准,右边大于或等于基准
			while(left<right) {
				 //先看右边,依次往左递减
		          while (list[right]>=list[stand]&&left<right) {
		              right--;
		          }
		          //再看左边,依次往右递增
		          while (list[left]<=list[stand]&&left<right) {
		              left++;
		          }
		          //如果满足条件则交换
		          if (left<right) {
		             swap(list,left,right);
		          }
			}		
			swap(list,left,stand);
			//递归调用左半边数组
			quicksort(list,low,right-1);
			//递归调用右半边数组
			quicksort(list,right+1,high);
		}
	}
	//将list[a]和list[b]交换
	public static void swap(int[] list,int a,int b) {
		int tmp = list[a];
		list[a] = list[b];
		list[b] = tmp;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值