快速排序算法

算法实现:

取待排序的第一个数为基数,找出它在整个区间的最终位置,找到它后,把整个区间分成两个子区间,

使得前面区间比它小,后面区间比它大。

遵循上述方法对各小区间进行同样的操作,直到各小区间只剩一个数,快速排序结束。

具体过程如下:

原始数列 8  4  12  6  1  5  10  由小到大快速排序

初始:        8  4  12  6  1  5  10   这里以8为基数  8下标为i   最后一个数10下标为j

第一趟 :   5  4  12  6  1  8  10    由上看出8和10比较,10大,不交换     从10开始往左边选数和基数8比较, 找到5和 8比,8大,交换  换过之后,从5开始往右选数与基数8比较

                  5  4   8  6  1  12  10    由上看出4和8比较不换     12和8比较,12大,交换  8就去到了前面。这个时候从12开始往左边选数与基数8比较

  5    4   1  6  8  12  10    由上看出  1和8 比较  8大  交换  8去后面,1去前面。  然后从1开始往右选数与基数8比较   6比8小,不换

  [5  4  1  6]  8  [12  10]    第一趟排序结束  以8为基数  把数列分为两个区间。再对两个区间分别使用这种方法排序  

直到每个区间被分的只剩下一个数,快速排序结束。

所以这里就用到了递归。

具体实现如下:

package com.sort;
/*
 * 快速排序算法
 * num[]待排序数组
 * 
 * 
 * */
public class QuickSort {
	//对从num[L]到num[R]的元素进行排序
	public static  void quickSort(int num[],int l,int r){
		int temp;//用来保存基准数
		int i=l,j=r;
		if(l<r){
			temp=num[l];
			while(i!=j){//判断排序是否结束
				while(j>i && num[j]>temp){//从右边往左扫描,找到一个小于temp的元素
					--j;
				}
				if(i<j){                    
					num[i]=num[j];/*找到后放在temp的左边,下标右移一位*/
					i++;
				}		
				while(j>i && temp>num[i]){//从左往右扫描,找到一个大于temp的元素
					i++;
				}
					if(i<j){
						num[j]=num[i]; /*找到后放在temp的右边,下标左移一位*/
						j--;
					}
				}
			num[i]=temp;//将temp放在最终位置
			quickSort(num, l, i-1);//递归对temp左边元素排序
			quickSort(num, i+1, r);//递归对temp又边元素排序
		}
	}
	public static void main(String[] args) {
		int[] num={2,3,4234,4,52,12,1212,32442};
		
		quickSort(num,0,7);
		for(int i=0;i<num.length;i++){
			System.out.println(num[i]);
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值