欢迎来到“世界和平”的主页

5种排序方式

package Sort;

public class SortMethods {
	
	public static void main(String[] args) {
		int a[]={51,56,86,99,-2,5,4,9,3};
		//1.第一种排序,比较简单,冒泡排序
		//bubbleSort(a);
		//bubbleSort2(a);
		//2.选择排序,先遍历一遍,把最大的数的位置找出来,放在最后一个位置,即a[a.length-1]
		//selectSort(a);
		//3.插入排序,即检查第i个数字,如果左边的数字比他大,进行交换,直到左边数字比他小,就停止
		//insertSort(a);
		//4.希尔排序,记录按下标的一定增量(以下用gap表示)分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,
		//当增量减至1时,整个文件恰被分成一组,算法便终止
		//shellSort(a);
		//5.快速排序(这个是经常会用到的排序算法,可以排那种很多数据的算法),首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,
		//然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
		quickSort(a,0,a.length-1);
		print(a);
	}
	
	//冒泡排序,把大的往后面挪,第一次把最大数排到最后位置(或者最小数,根据题意,此处把最大数排到最后)
	private static void bubbleSort(int a[]) {
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-1-i;j++){
				if(a[j]>a[j+1]){
					swap(a,j,j+1);
				}
			}
		}
		print(a);
	}
	//优化之后的冒泡排序
	private static void bubbleSort2(int a[]){
		for(int i=0;i<a.length-1;i++){
			boolean flag=true;
			for(int j=0;j<a.length-1-i;j++){
				if(a[j]>a[j+1]){
					swap(a, j, j+1);
					flag=false;
				}
				
			}
			if(flag==true){
				break;
			}
		}
		print(a);
	}
	
	//选择排序的代码
	private static void selectSort(int a[]){
		for(int i=0;i<a.length-1;i++){
			int k=i;
			for(int j=i+1;j<a.length;j++){
				if(a[k]>a[j]){
					k=j;
				}
			}
			if(k!=i){
				swap(a, i, k);
			}
		}
		print(a);
	}
	
	//插入排序的代码
	private static void insertSort(int a[]){
		for(int i=0;i<a.length-1;i++){
			int temp=a[i+1];
			int j=i;
			while(a[j]>temp){   
				a[j+1]=a[j];    //把a[j]放在a[j+1]的位置上
				j--;			//j-1,继续和左边的数比较
				if(j<0){
					break;
				}
			}
			a[j+1]=temp;
		}
		print(a);
	}
	
	//希尔排序
	private static void shellSort(int a[]){
		for(int gap=(a.length+1)/2;gap>0;){  //此处用gap表示shell排序中的增量
			//接下来用冒泡的排序算法一步步排下去
			for(int i=0;i<a.length-gap;i++){
				for(int j=i;j<a.length-gap;j+=gap){
					if(a[j]>a[j+gap]){
						swap(a, j, j+gap);
					}
				}
			}
			if(gap>1){
				gap=(gap+1)/2;
			}else if(gap==1){
				break;
			}
		}
		print(a);
	}
	
	//快速排序算法,主要思想就是把一个组分成两个组,以第一个数字为界,左边放比他小的数,右边放比他大的数
	public static void quickSort(int a[],int s,int e){  //此处s表示第一个数字的下标,e表示最后一个数字下标
		if(s<e){
			////把数组划分成:两个子数组和一个元素
			// a[s:e] ==> a[s:q-1], a[q], a[q+1:e]
			int q=partition(a,s,e);
			quickSort(a, s, q-1);
			quickSort(a, q+1, e);
		}
	}
	private static int partition(int a[], int s, int e) {
		
		int rand = (int)(Math.random()*(e-s));
		swap(a,s,s+rand);
		
		int x=a[s];  //第1个元素为枢轴
		int i=s;
		int j=e+1;
		while(true){
			while(a[++i]<x&&i<e);//在左侧定位到比枢轴大的数
			while(a[--j]>x);//在右侧定位到比枢轴小的数
			if(i>=j){
				break;
			}
			swap(a, i, j);
		}
		swap(a,s,j);
		return j;
	}

	//交换方法
	private static void swap(int a[],int j,int i){
		a[j]=a[i]^a[j];
		a[i]=a[i]^a[j];
		a[j]=a[i]^a[j];
	}
	//输出的方法
	private static void print(int a[]){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
	
}

此处写了5种比较常用的排序方式,冒泡排序,选择排序,插入排序,希尔排序和快排,灵活运用,基本methods就是上面的代码,万变不离其宗。
posted @ 2016-03-16 17:45  yiyan00  阅读(201)  评论(0编辑  收藏  举报