java 算法 6种排序小结
目录
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
冒泡排序
package 冒泡排序; import java.util.Arrays; public class Bubble { /** * 对数组a中的元素进行排序 * @param a */ public static int[] sort(int[] a){ for (int i=a.length-1;i>0;i--){ for (int j=0;j<i;j++){ if(greater(a[j],a[j+1])){ exch(a,j,j+1); } } } return a; } /** * 比较v元素是否大于w元素 * @param v * @param w * @return */ private static Boolean greater(int v,int w){ if (v>=w){ return true; } return false; } /** * 数据元素i和j交换位置 * @param a * @param i * @param j */ private static void exch(int[] a,int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t; } public static void main(String[] args) { int[] a={4,5,6,3,2,1}; int[] sort = Bubble.sort(a); System.out.println(Arrays.toString(sort)); } }
选择排序
package cn.itcast.algorithm.sort; /** * 选择排序 */ public class Selection { /* 对数组a中的元素进行排序 */ public static void sort(Comparable[] a){ for(int i=0;i<=a.length-2;i++){ //定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置 int minIndex = i; for(int j=i+1;j<a.length;j++){ //需要比较最小索引minIndex处的值和j索引处的值; if (greater(a[minIndex],a[j])){ minIndex=j; } } //交换最小元素所在索引minIndex处的值和索引i处的值 exch(a,i,minIndex); } } /* 比较v元素是否大于w元素 */ private static boolean greater(Comparable v,Comparable w){ return v.compareTo(w)>0; } /* 数组元素i和j交换位置 */ private static void exch(Comparable[] a,int i,int j){ Comparable temp; temp = a[i]; a[i]=a[j]; a[j]=temp; } }
插入排序
package 插入排序; import java.util.Arrays; public class Insertion { public static void sort(int[] a){ for (int i=1;i<a.length;i++){ //当前元素为a[i],依次和i前面的元素比较,找到一个小于a[i]的元素 for (int j=i;j>0;j--){ if (greater(a[j-1],a[j])){ exch(a,j-1,j); }else { break; } } } } /** * 比较v元素是否大于w元素 * @param v * @param w * @return */ private static Boolean greater(int v,int w){ if (v>=w){ return true; } return false; } /** * 数据元素i和j交换位置 * @param a * @param i * @param j */ private static void exch(int[] a,int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t; } public static void main(String[] args) { int[] a={4,3,2,10,12,1,5,6}; Insertion.sort(a); System.out.println(Arrays.toString(a)); } }
希尔排序
package 希尔排序; import java.util.Arrays; public class Shell { /* 对数组a中的元素进行排序 */ public static void sort(Comparable[] a) { int N = a.length; //确定增长量h的最大值 int h = 1; while (h < N / 2) { h = h * 2 + 1; } //当增长量h小于1,排序结束 while (h >= 1) { //找到待插入的元素 for (int i = h; i < N; i++) { //a[i]就是待插入的元素 //把a[i]插入到a[i-h],a[i-2h],a[i-3h]...序列中 for (int j = i; j >= h; j -= h) { //a[j]就是待插入元素,依次和a[j-h],a[j-2h],a[j-3h]进行比较,如果a[j]小,那么交换位置,如果不小于,a[j] 大,则插入完成。 if (greater(a[j - h], a[j])) { exch(a, j, j - h); } else { break; } } } h /= 2; } } /* 比较v元素是否大于w元素 */ private static boolean greater(Comparable v, Comparable w) { return v.compareTo(w) > 0; } /* 数组元素i和j交换位置 */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } //测试代码 public static void main(String[] args) { Integer[] a = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5}; Shell.sort(a); System.out.println(Arrays.toString(a)); } }
归并排序
package 归并排序; import java.util.Arrays; public class Merge { private static Comparable[] assist;//归并所需要的辅助数组 /* 对数组a中的元素进行排序 */ public static void sort(Comparable[] a) { assist = new Comparable[a.length]; int lo = 0; int hi = a.length - 1; sort(a, lo, hi); } /* 对数组a中从lo到hi的元素进行排序 */ private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) { return; } int mid = lo + (hi - lo) / 2; //对lo到mid之间的元素进行排序; sort(a, lo, mid); //对mid+1到hi之间的元素进行排序; sort(a, mid + 1, hi); //对lo到mid这组数据和mid到hi这组数据进行归并 merge(a, lo, mid, hi); } /* 对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并 */ private static void merge(Comparable[] a, int lo, int mid, int hi) { //lo到mid这组数据和mid+1到hi这组数据归并到辅助数组assist对应的索引处 int i = lo;//定义一个指针,指向assist数组中开始填充数据的索引 int p1 = lo;//定义一个指针,指向第一组数据的第一个元素 int p2 = mid + 1;//定义一个指针,指向第二组数据的第一个元素 //比较左边小组和右边小组中的元素大小,哪个小,就把哪个数据填充到assist数组中 while (p1 <= mid && p2 <= hi) { if (less(a[p1], a[p2])) { assist[i++] = a[p1++]; } else { assist[i++] = a[p2++]; } } //上面的循环结束后,如果退出循环的条件是p1<=mid,则证明左边小组中的数据已经归并完毕,如果退 //出循环的条件是p2 <= hi, 则证明右边小组的数据已经填充完毕; //所以需要把未填充完毕的数据继续填充到assist中,//下面两个循环,只会执行其中的一个 while (p1 <= mid) { assist[i++] = a[p1++]; } while (p2 <= hi) { assist[i++] = a[p2++]; } //到现在为止,assist数组中,从lo到hi的元素是有序的,再把数据拷贝到a数组中对应的索引处 for (int index = lo; index <= hi; index++) { a[index] = assist[index]; } } /* 比较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 t = a[i]; a[i] = a[j]; a[j] = t; } //测试代码 public static void main(String[] args) throws Exception { Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; Merge.sort(arr); System.out.println(Arrays.toString(arr)); } }
快速排序
package 快速排序; import java.util.Arrays; public class Quick { public static void sort(Comparable[] a) { int lo = 0; int hi = a.length - 1; sort(a, lo, hi); } private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) { return; } //对a数组中,从lo到hi的元素进行切分 int partition = partition(a, lo, hi); //对左边分组中的元素进行排序 //对右边分组中的元素进行排序 sort(a, lo, partition - 1); sort(a, partition + 1, hi); } public static int partition(Comparable[] a, int lo, int hi) { Comparable key = a[lo];//把最左边的元素当做基准值 int left = lo;//定义一个左侧指针,初始指向最左边的元素 int right = hi + 1;//定义一个右侧指针,初始指向左右侧的元素下一个位置 //进行切分 while (true) { //先从右往左扫描,找到一个比基准值小的元素 while (less(key, a[--right])) {//循环停止,证明找到了一个比基准值小的元素 if (right == lo) { break;//已经扫描到最左边了,无需继续扫描 } } //再从左往右扫描,找一个比基准值大的元素 while (less(a[++left], key)) {//循环停止,证明找到了一个比基准值大的元素 if (left == hi) { break;//已经扫描到了最右边了,无需继续扫描 } } if (left >= right) { //扫描完了所有元素,结束循环 break; } else { //交换left和right索引处的元素 exch(a, left, right); } } //交换最后rigth索引处和基准值所在的索引处的值 exch(a, lo, right); return right;//right就是切分的界限 } /* 数组元素i和j交换位置 */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } /* 比较v元素是否小于w元素 */ private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } //测试代码 public static void main(String[] args) throws Exception { Integer[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 8}; Quick.sort(arr); System.out.println(Arrays.toString(arr)); } }
到此这篇关于java 算法 6种排序的文章就介绍到这了,更多相关java 算法排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)