多种排序算法-java实现

1. 插入排序:java

核心思想:将第 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. 冒泡排序:ui

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

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.归并排序:class

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

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. 快速排序数据

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

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;
		}
	}
}