1、冒泡排序
排序原理
- 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
- 对相邻的每一对元素做同样的操作,从开始第一对元素到结尾最后一对元素,最终最后位置的元素就是最大值。
代码实现
public class Bubble {public void sort(Comparable[] a) {int n = a.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < j - n -1; j++) {if (greater(a[j],a[j + 1])) {exchange(a, j, j + 1);}}}}//比较元素v是否大于元素wprivate boolean greater(Comparable v, Comparable w) {return v.compareTo(w) > 0;}//数组元素i和j交换位置private void exchange(Comparable[] a, int i, int j) {Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}}
public class Bubble {private static void sort(int nums[]) {int n = nums.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (nums[j] > nums[j + 1]) {int temp;temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}}public static void main(String[] args) {int[] arr = {1, 3, 2, 5, 7, 6};sort(arr);System.out.println(Arrays.toString(arr));}}
2、选择排序
排序原理
- 在每一次遍历的过程中,都假定第一个索引处的的元素为最小值。依次和其他位置的值进行比较,不断更新最小值所在的索引。
- 交换第一个索引处的值和最小值所在索引的值
代码实现
public class Selection {public static void sort(Comparable[] a) {int n = a.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if(greater(a[minIndex],a[j])) {minIndex = j;}}exch(a, i, minIndex);}}private static boolean greater(Comparable v, Comparable w) {return v.compareTo(w) > 0;}private static void exch(Comparable[] a, int i, int j) {Comparable temp;temp = a[i];a[i] = a[j];a[j]= temp;}}
3、插入排序
排序原理
- 所有元素分为两组,已经排序的和未排序的
- 找到未排序组中的第一个元素,向已排序的组中插入、
- 倒序遍历已经排序的元素,依次和待插入的元素比较。
代码实现
public class Insertion {public static void sort(Comparable[] a) {int n = a.length;for (int i = 1; i < n; i++) {for (int j =i; j >= 0; j--) {if (greater(a[j - 1],a[j])) {exch(a, j - 1, j);} else {break;}}}}private static boolean greater(Comparable v, Comparable w) {return v.compareTo(w) > 0;}private static void exch(Comparable[] a, int i, int j) {Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}}
希尔排序
希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。
如果已排序分组的元素是{2,5,7,9,10},未排序分组元素为{1,8},那么下一个待插入元素为1,我们需要拿着1进行倒序遍历(从后往前依次和10,9,7,5,2进行交换位置)。每次交换只能和相邻的元素进行。想要提高效率,直观的想法是交换一次,把1放到2之前,减少交换的次数。
排序原理
- 选定一个增长量h,按照h作为数据分组的依据来分组(一对数据)
- 对分好组的每一组数据进行插入排序
- 减小增长量,最小减为1,重复第二步操作
代码实现
public class Shell {public static void sort(Comparable[] a) {//根据数组a的长度,确定增量hint h = 1;while (h < a.length / 2) {h = h * 2 + 1;}//希尔排序while (h >= 1) {//找到待插入的元素for (int i = h; i < a.length; i++) {for (int j = i; j >= h; j -= h) {if (greater(a[j - h], a[j])) {exch(a, j - h, j);} else {break;}}}h = h /2;}}private static boolean greater(Comparable v, Comparable w) {return v.compareTo(w) > 0;}private static void exch(Comparable[] a, int i, int j) {Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}}
归并排序
排序原理
- 尽可能的将一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数为1
- 将相邻的两个子组进行合并,成为一个有序的大组
- 不断地重复步骤2,直到最终只有一个组

代码实现
public class Merge {//所需要的辅助数组private static Comparable[] assist;//比较v元素是否小于w元素private static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}//数组元素i和j交换位置private static void exch(Comparable[] a, int i, int j) {Comparable temp = a[i];a[i] = a[j];a[j] = temp;}//对数组a中的元素进行排序public static void sort(Comparable[] a) {//1.初始化辅助数组assitassist = new Comparable[a.length];//2.定义一个low变量和一个high变量,记录最小索引和最大索引int low = 0;int high = a.length - 1;//3.调用sort重载方法,完成从low到high索引的排序sort(a, low, high);}//对数组a中从low到high的元素进行排序public static void sort(Comparable[] a, int low, int high) {if (high <= low) {return;}//对low到high之间的数据进行分组,两个组int mid = low + (high - low) / 2;//分别对每一组数据进行排序sort(a, low, mid);sort(a,mid + 1,high);//再把两个数组中的数据进行归并merge(a, low, mid, high);}//对数组中,从low到mid为一组,从mid+1到high为一组,对着两组数据进行归并private static void merge(Comparable[] a, int low, int mid, int high) {//定义三个指针int i = low;int p1 = low;int p2 = mid + 1;//遍历,移动p1指针和p2指针,比较对应索引处的值,找到小的那个放到辅助数组里while (p1 <= mid && p2 <= high) {//比较对应索引处的值if (less(a[p1],a[p2])) {assist[i++] = a[p1++];} else {assist[i++] = a[p2++];}//如果p1的指针没有走完,那么顺序移动p1指针,把对应的元素放到辅助数组中while (p1 <= mid) {assist[i++] = a[p1++];}//如果p2的指针没有走完,那么顺序移动p2指针,把对应的元素放到辅助数组中while (p2 <= high) {assist[i++] = a[p2++];}//把辅助数组的元素拷贝到原数组中for (int index = low; index <= high; index++) {a[index] = assist[index];}}}}
快速排序
排序原理
- 首先设定一个分界值,通过该分界值将数组分成左右两部分
- 将大于或者等于分界值的数据放到数组右边,小于分界值的数据放到数组的左边。
- 左边和右边的数据可以独立排序。对于左侧的数据,又可以取一个分界值,将该数据分为左右两部分,左边放较小值,右边放较大值。右侧数据同理。
- 重复上述过程。可以看出这是一个递归,通过递归分别将左、右部分进行排序。

