快速排序

快速排序

快速排序 是我们实际开发中经常会用到的排序算法,而面试或笔试中遇到的概率也很大。快排有三种讲解法,我讲一下挖坑法。首先,我们做一下快速排序的准备工作。

快排的原理说简单点就是分拣石头,我们找一个标准大小石头,比标准大的石头我们放在右边,小的放在左边,这样不就有序一些了吗,我们再把标准左边和右边的石头们递归排序,最后不就完全有序了吗。

具体怎么实现呢,看下图,我们准备了一个无序数组x,定义了low和high当作指针,把mid当作标准

在这里插入图片描述

从x[0]挖了一个坑后,我们先从最后面的数开始,如果x[high]>=mid;high–;意思就是如果数比6大,那么就不用挖坑,指针high往前走一位,如果碰到一个数比6小的,我们就把这个数填到前面的那个坑,这时候x[high]的位置就变成了一个新坑。现在high指针不动,我们动low指针,如果low指针的数小于6,则low指针向后走,如果low指针的数大于6,则把这个数填到high指针指向的坑处,,然后又从high指针开始,就这样,直到low指针与high指针相等,这时low和high指向的坑由6填上。然后我们再对6两边依然无序的数进行递归操作。递归完,我们的数组就排完序了。

看代码:

 
public class MySort {

	public static void main(String[] args) {
			int x[]= {4,2,7,9,0,2,3,5};
			quikSort(x,0,x.length-1);
			
			for (int i : x) {
				System.out.print(i+",");
			}
		}	
    
	public static void quikSort(int[] x,int low,int high) {
		
		if(low<high) {
		int m=partSort(x,low,high);
		quikSort(x,low,m-1);
		quikSort(x,m+1,high);
		}
	}
	public static int partSort(int[] x,int low,int high) {
		 
		int mid=x[low];
		while(low<high) {
			while(low<high&&x[high]>=mid) {
				high--;
			}
			x[low]=x[high];

			while (low < high && x[low] < mid) {
				low++;
			}
			x[high] = x[low];
		}
		
		x[low]=mid;
		
		return low;
			
	}	
		
}

输出结果:0,2,2,3,4,5,7,9, 读者可以自己运行一下试试。说句题外话,为什么要叫这个排序算法为快速排序呢?难道是因为这个算法很快吗?这里我拿冒泡算法和它做一个比较。同样用了50000个数据的数组,分别进行排序(我试了一下,两个50000地数据的数组导致了栈内存溢出,笑哭)

结果如下图:

在这里插入图片描述在这里插入图片描述

结果我们发现,同样50000数据的规模下,冒泡用了3354毫秒,而快速排序只用了13毫秒,这是什么差距?完全不是一个数量级的好不好,所以到这里你能理解为什么实际中我们用到快排的时候比较多吧。当我们处理海量数据的时候,快排的优势就展示出来了。快速排序的时间复杂度是O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值