多种排序算法-java实现

1. 插入排序:

核心思想:将第 i 个数字插入到0 ~ i - 1的有序数列中

		int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4 };
		for(int i = 0; i < a.length; i++) {
			int tmp = a[i];
			int j = i - 1;
			while( j >= 0 && a[j] > tmp) {
				a[j + 1] = a[j];
				j--;
			}
			a[j + 1] = tmp;
		}
		
		for(int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}

2. 冒泡排序:

核心思想:对比相邻的数字,较大的数字放到后面

		int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 1000, 5, 6, 4, -1, 0, 100 };
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a.length - 1 - i; j++) {
				if (a[j] > a[j + 1]) {
					int tmp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = tmp;
				}
			}
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}

3. 选择排序:

核心思想:从后面序列中找到最小值,交换到有序序列的末尾

		int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4, 0, 100, -1 };
		for (int i = 0; i < a.length; i++) {
			int index = i, min = a[i];
			for(int j = i + 1; j < a.length; j++) {
				if (a[j] < min) {
					min = a[j];
					index = j;
				}
			}
			int tmp = a[i];
			a[i] = a[index];
			a[index] = tmp;
		}
		for(int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}

4.归并排序:

核心思想:递归+合并,分治思想。将数组分割成两个有序数组,并合并这两个数组。

public class MergeSort {

	public static void main(String[] args) {
		int a[] = new int[] { 2, 4, 1, 6, 3, 7, 1, 8, 5, 6, 4, 18, -3, -76, 71, 21, 0, 0 };
		MergeSort mergeSort = new MergeSort();
		mergeSort.mergeSort(a, 0, a.length - 1);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+ "  ");
		}
	}

	public void mergeSort(int[] a, int begin, int end) {
		if (begin < end) {
			int min = (begin + end) / 2;
			mergeSort(a, begin, min);
			mergeSort(a, min + 1, end);
			merge(a, begin, min, end);
		}
	}

	public void merge(int a[], int begin, int min, int end) {
		int left[] = new int[min - begin + 1];
		int right[] = new int[end - min];
		int i = 0, j = 0, k = 0;
		for (i = begin; i <= end; i++) {
			if (i <= min) {
				left[j++] = a[i];
			} else {
				right[k++] = a[i];
			}
		}
		j = 0;
		k = 0;
		i = begin;
		while (j < left.length && k < right.length) {
			if (left[j] < right[k]) {
				a[i++] = left[j++];
			} else {
				a[i++] = right[k++];
			}
		}
		while (j < left.length) {
			a[i++] = left[j++];
		}
		while (k < right.length) {
			a[i++] = right[k++];
		}
	}
}

5. 快速排序

核心思想:分治法,先“治理”,后“拆分”。选出基准值,用挖坑填坑法治理。递归再治理。

public class QuickSort {

	public static void main(String[] args) {
		int a[] = new int[] { 7, 4, 1, 6, 3, 10, 21, 11, -1, -3, 4, 7, 1, 8, 122, 99, 5, 6, 4 };
		QuickSort qSort = new QuickSort();
		qSort.quickSort(a, 0, a.length - 1);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}
	}

	public void quickSort(int a[], int begin, int end) {
		if (begin < end) {
			int tmp = a[begin];
			int i = begin, j = end;
			while (i < j) {
				while (i < j && a[j] > tmp) {
					j--;
				}
				if (i < j) {
					a[i++] = a[j];
				}
				while (i < j && a[i] < tmp) {
					i++;
				}
				if (i < j) {
					a[j--] = a[i];
				}
			}
			a[i] = tmp;
			quickSort(a, begin, i - 1);
			quickSort(a, i + 1, end);
		}
	}
}

6.希尔排序

核心思想:插入排序在数据基本有序前提下运行效率高。按步长将数组划分为多个“子数组”,每个“子数组”成员间隔为步长,每个子数组执行插排。逐渐缩短步长(gap /= 2),再次执行多次插排,直到步长缩短为0。

public class ShellSort {

	public static void main(String[] args) {
		int a[] = new int[] { 10, 9, 11, 92, 32, 2, 4, 1, 6, 3, 7, 0 ,-2, -7, -9, 11, 1, 8, 5, 6, 4 };
		int gap = a.length / 2;
		while (gap > 0) {
			for (int i = 0; i < gap; i++) {
				insert(a, i, gap);
			}
			gap /=2;
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}
	}

	public static void insert(int a[], Integer begin, int gap) {
		/* 插入排序增量为1,而希尔排序增量为gap */
		for (int i = begin; i < a.length; i += gap) {
			int tmp = a[i];
			int j = i - gap;
			while (j >= 0 && a[j] > tmp) {
				a[j + gap] = a[j];
				j -= gap;
			}
			a[j + gap] = tmp;
		}
	}
}

 

转载于:https://my.oschina.net/u/2333484/blog/919766

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值