快速排序算法

快速排序是对冒泡排序的一种改进,假设有一个数组要进行排序,首先选用数组的第一个数作为基准值,其余比基准值小的数放在它的左边,比基准值大的数放在它的右边

一次快速排序的算法是:

设置两个变量:i,j

第一次比较

从j开始向前搜索,即由后(右)开始向前(左)搜索(j--),找到第一个小于k的值j,将j和i下标的值互换;

假设用户输入了如下数组:
下标
0
1
2
3
4
5
数据
6
2
7
3
8
9
排序开始时:i=0,j=5
创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6( 赋值为第一个数据的值也就是基准值)。
把所有比k小的数移动到k的左边,然后开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3的位置,完成第一次比较:
下标
0
1
2
3
4
5
数据
3
2
7
6
8
9
i=0 j=3 k=6
第二次比较

从i开始向后搜索,即由前(左)开始向后(右)搜索(i++),找到第一个大于k的i,将i和j下标的值互换;

第二次比较,要变成找比k大的了,而且要从前往后找,递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据6做交换,数据状态变成下表:
下标
0
1
2
3
4
5
数据
3
2
6
7
8
9
i=2 j=3 k=6

接着,不断重复进行上面的循环比较,直到数组不能再分解为止(只有一个数据)

以下是实现快速排序的java代码

 public static void quickSort(int[] array, int min, int max) {  
		 //定义第一个数和最后一个数
	        int start = min;  
	        int end = max; 
	    //定义基准值
	        int key = array[min]; 
	    //循环比较
	        while (end > start) {  
	            // 从后面开始开始找比基准值小的数  
	            while (end > start && array[end] >= key) {  
	                // 如果没有比关键值小的,比较下一个,直到有比基准值小的就交换位置,然后又从前往后开始比较  
	                end--;  
	            }  
	            //值的交换  
	            if (array[end] <= key) {  
	                int index = array[end];  
	                array[end] = array[start];  
	                array[start] = index;  
	            }  
	            // 从前面开始找比基准值大的数  
	            while (end > start && array[start] <= key) {  
	                //如果没有比关键值大的,比较下一个,直到有比关键值大的就交换位置  
	                start++;  
	            }  
	            //值的交换  
	            if (array[start] >= key) {  
	                int index = array[start];  
	                array[start] = array[end];  
	                array[end] = index;  
	            }  
	        }  
	          //递归  
	        if (start > min) {  
	            //左边序列。第一个索引位置到基准值的索引-1  
	        	quickSort(array, min, start - 1);  
	        }  
	        if (end < max) {  
	            //右边序列。从基准值的索引+1到最后一个  
	        	quickSort(array, end + 1, max);  
	        }  
	    }  
	  //给数组赋值并输出
	    public static void main(String[] args) {  
	        int[] array = { 23,53,77,36,84,76,93,13,45,23 };  
	        quickSort(array, 0, array.length - 1);  
	        for (int i = 0; i < array.length; i++) {  
	            System.out.println(array[i]);  
	        }  
	    }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值