老生常谈 排序算法---快速排序

关于快速排序,我觉得是必须掌握的排序算法,因为这个算法真的是很奇妙,不知道发明者当初是怎么想出来的。

这种基于分治策略的算法平均时间复杂度基本都是nlgn,快速排序优点是不需要像归并排序一样占用额外空间。

快速排序的思路就是以某一个数字作为分割,一般是以第一个或者最后一个,然后从左边找比它大的跟右边找到的比它小的互换,最后实现左边的值都比此值小,右边值都比它大。然后对它分割开的序列再次如此,直到序列为1个值结束,完整成个排序过程。


代码如下:

其中Partition2就是上面的思路,Partition是以右边值为分割值的方法,我还是上面图中的思路更习惯一点。

package exam.sorts;

public class QuickSort {

public static int Partition(int a[],int p,int r){
		int x=a[r];
		int i=p-1;
		int temp;
	    for(int j=p;j<=r-1;j++){
	    	if(a[j]<=x){
	    		// swap(a[j],a[i]);
	    		i++;
	    		System.out.println(j+" "+i);
	    		temp=a[j];
	    		a[j]=a[i];
	    		a[i]=temp;
		    	show(a);
	    	}
	    }
	    //swap(a[r,a[i+1]);
	    temp=a[r];
	    a[r]=a[i+1];
	    a[i+1]=temp;
	    show(a);
	    return i+1;
	}
public static int Partition2(int a[],int p,int r){
	int x=a[p];
	int i=p+1;
	int j=r;
	int temp;
	do{
		while(a[i]<x){
			i++;
		}
		while(a[j]>x){
			j--;
		}
		if(i<j){
			 temp=a[i];
		    a[i]=a[j];
		    a[j]=temp;
		}else{
			break;
		}
		show(a);
	}while(true);
    temp=a[p];
    a[p]=a[j];
    a[j]=temp;
    show(a);
	return j;
}
	public static void QuickSort(int a[],int p,int r){
		
		if(p<r){
			int q=Partition2(a,p,r);
			QuickSort(a,p,q-1);
			QuickSort(a,q+1,r);
			
		}
		
	}
	public static void show(int a[]){
		for (int i=0;i<10;i++)
			 System.out.print(a[i]+ " ");
		System.out.println();
	}
public static void main(String[] stra){
		
		int a[]={23,53,77,36,84,76,93,13,45,23};
		show(a);
		QuickSort(a,0,9);
		show(a);
		

}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

day walker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值