码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序模板

时间:2015-08-01 19:02:03      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:希尔排序

以某个记录(元素)为界(该记录称为支点或枢轴),将待排序列分成两部分:

①一部分: 所有记录的关键字大于等于支点记录的关键字

②另一部分: 所有记录的关键字小于支点记录的关键字

算法描述:

1、任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列

2、左侧子序列中所有记录的关键字都小于或等于基准记录的关键字 

3、右侧子序列中所有记录的关键字都大于基准记录的关键字

4、基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。

5、然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。

public class SortMethods {
	
	/*输出数组中的元素*/
	private static void print(int[] a) {
		for(int num: a){
			System.out.print(num+"\t");
		}
		System.out.println();
	}
	private static void swap(int[] a, int i, int j) {
		int temp;
		temp =a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	
	public static void main(String[] args) {
		int a[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40};
		shellSort(a);
		print(a);
	}

	private static void quickSort(int[] a, int p, int r) {
		if(p<r){
			//把数组划分成两个子数组和一个元素(枢轴):
			//用枢轴a[q]把整数数组划分成 ==>  a[p,q-1] , a[q] , a[q+1,r]
			int q = partition(a,p,r); //a[q]
			quickSort(a,p,q-1);//排左边的子数组a[p,q-1]
			quickSort(a,q+1,r);//排右边的子数组a[q+1,r]
		}
		
	}
	private static int partition(int[] a, int p, int r) {
		//优化:采用随机选择策略确定枢轴----随机选取数组当中的一个元素,和第一个元素进行交换。之后,以第一个元素作为枢轴进行划分
		int rand = (int)(Math.random()*(r-p));//rand为区间内的随机序号(第几个)//p=10000, r=15000
		swap(a,p,p+rand);
		
		int i=p;//第一个元素定为枢轴
		int j=r+1;
		int x=a[p];
		
		while(true){
			while(a[++i]<x && i<r);//定位指针i,找比x大的元素 <--为的是找要交换到右边的"非法"元素
			while(a[--j]>x);//定位指针j <--为的是找要交换到左边的"非法"元素
			if(i>=j){
				break;
			}
			swap(a,i,j);
		}
		swap(a,p,j);//枢轴a[p]要换到中间位置
		return j;
	}
	
}






版权声明:本文为博主原创文章,未经博主允许不得转载。

快速排序模板

标签:希尔排序

原文地址:http://blog.csdn.net/u011479875/article/details/47188405

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!