改良版随机快速排序

快速排序(Quick Sort)的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。我们学的快排大概都是这样:

 int part(int a[],int low,int high){
                int temp=a[low];
                while(low<high){
                    while(low<high && a[high] > temp)
                        high--;
                    a[low]=a[high];
                    while(low<high && a[low] < temp)
                        low++;
                    a[high]=a[low];
                }
                a[low]=temp;
                return low;
            }
 void quicksort(int a[],int low,int high){
                if(low < high){
                    int middle=part(a, low, high);
                    quicksort(a, low, middle-1);
                    quicksort(a,middle+1,high);
                }
            }

快排一次是将基准元素找到合适的位置,然后由基准元素划分为两部分再进行快速排序,但是快速排序存在最坏情况是就是如果为最大或者最小数字,且序列可能是非常有序的,那么就有可能将所有数都划分到一个序列去了,这样的话最坏的时间复杂度为O(n^2),因此常见的算法解决思想就是随机产生一个基准元素,然后交换你的low元素,再进行划分的序列,这样就很大程度上避免了最坏情况的产生。也就是说快排的时间不再是你的数据问题,而是你的随机数产生值的问题。
 int part(int a[],int low,int high){
	int temp=a[low];
	while(low<high){
		while(low<high && a[high] > temp)
		  high--;
		a[low]=a[high];
		while(low<high && a[low] < temp)
		    low++;
		a[high]=a[low];
	   }
		a[low]=temp;
		return low;
	}
		
		
int randpartition(int a[],int low,int high){
	Random rand=new Random();
	int ran=low+rand.nextInt(high-low+1);
	int tem;
	tem=a[ran];
	a[ran]=a[low];
	a[low]=tem;
	return part(a,low,high);
}
			
void quicksort(int a[],int low,int high){
	if(low < high){
		int middle=randpartition(a, low, high);
		quicksort(a, low, middle-1);
		quicksort(a,middle+1,high);
		}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值