几个排序算法

1.选择排序
	private static void sort(int[] a) {
		int min;
		for(int i=0;i<a.length-1;i++){
			min=i;
			for(int j=i+1;j<a.length;j++){
				if(esUtils.less(a[j], a[min])){
					min=j;
				}
			}
			esUtils.exchange(a, min, i);
		}
		
		
	}

2.插入排序

	private static void sort(int[] a) {
		for(int i=0;i<a.length-1;i++){
			for(int j=i+1;j>0&&esUtils.less(a[j], a[j-1]);j--){
				esUtils.exchange(a, j-1, j);
			}
		}
	}


3.希尔排序

	private static void sort(int[] a) {
		int len=a.length;
		int h=1;
		while(h<len/3) h=h*3+1;
		while(h>=1){
			for(int i=h;i<len;i++){
				for(int j=i;j>=h&&esUtils.less(a[j], a[j-h]);j-=h){
					esUtils.exchange(a, j-h, j);
				}
			}
			h=h/3;
		}
	}

4.自顶向下的归并排序

	private static void sort(int[] a, int lo, int hi) {
		if (hi <= lo)
			return;
		int mid = lo + (hi - lo) / 2;
		sort(a, lo, mid);
		sort(a, mid + 1, hi);
		merge(a, lo, mid, hi);
	}

	private static void merge(int[] a, int lo, int mid, int hi) {
		int i=lo,j=mid+1;
		int[] aux=new int[len];
		for(int k=lo;k<=hi;k++)
			aux[k]=a[k];
		for(int k=lo;k<=hi;k++){
			if(i>mid) a[k]=a[j++];
			else if(j>hi) a[k]=a[i++];
			else if(esUtils.less(a[j], a[i]))
				a[k]=a[j++];
			else a[k]=a[i++];
		}
	}

5.自下向上的归并排序

private static void sort(int[] a) {
		for (int sz = 1; sz < len; sz = sz + sz) {
			for (int lo = 0; lo < len - sz; lo += sz + sz) {
				merge(a, lo, lo + sz - 1, Math.min(len - 1, sz + sz + lo - 1));
			}
		}
	}

	private static void merge(int[] a, int lo, int mid, int hi) {
		int i = lo, j = mid+1;
		int[] aux = new int[len];
		for (int k = lo; k <= hi; k++)
			aux[k] = a[k];
		for (int k = lo; k <= hi; k++) {
			if (i > mid)
				a[k] = a[j++];
			else if (j > hi)
				a[k] = a[i++];
			else if (esUtils.less(a[j], a[i]))
				a[k] = a[j++];
			else
				a[k] = a[i++];
		}
	}

ps:

几个函数

package 归并排序;

import java.util.Random;

public class esUtils {
	long t = 0;

	public esUtils() {
		t = System.currentTimeMillis();
	}

	/**
	 * 返回从创建对象到调用此方法经过的时间
	 */
	public void end() {
		long end = System.currentTimeMillis();
		System.out.println(end - t + "毫秒");
	}

	/**
	 * 判断是否是有序的
	 * 
	 * @param a
	 */
	public static void isSort(int[] a) {
		for (int i = 0; i < a.length - 1; i++) {
			if (a[i] > a[i + 1]) {
				System.out.println("错误->" + i);
				return;
			}
		}
	}

	/**
	 * 得到一个len长度的数组
	 * 
	 * @param len
	 *            数组长度
	 * @return 返回数组
	 */
	public static int[] getArray(int len) {
		int[] a = new int[len];
		for (int i = 0; i < len; i++) {
			int t = new Random().nextInt(len);
			a[i] = t;
		}
		return a;
	}

	/**
	 * 第一个数比第二个小,返回真
	 * 
	 * @param a
	 *            数字1
	 * @param b
	 *            数字2
	 * @return 比较结果
	 */
	public static boolean less(int a, int b) {
		if (a < b)
			return true;
		return false;
	}

	/**
	 * 交换两个数
	 * 
	 * @param a
	 *            所在数组
	 * @param i
	 *            索引1
	 * @param j
	 *            索引2
	 */
	public static void exchange(int[] a, int i, int j) {
		if (i == j)
			return;
		int t = a[i];
		a[i] = a[j];
		a[j] = t;
	}

	/**
	 * 输出这个数组
	 * 
	 * @param a
	 *            数组
	 */
	public static void putArray(int[] a) {
		int len = 1;
		System.out.println("数组如下");
		for (int i : a) {
			System.out.print(i + "\t");
			if (len % 10 == 0) {
				System.out.println();
				len = 0;
			}
			len++;
		}
		System.out.println("\n--------------------------");
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_40387150/article/details/80899263