Java学习——排序算法
若看到这篇文章的小伙伴发现内容有错误请告诉我改正。一、简单排序算法1、冒泡排序详细解释和java代码实现见以下文章https://blog.csdn.net/zxmda/article/details/146965243?spm1011.2415.3001.10575sharefrommp_manage_linkhttps://blog.csdn.net/zxmda/article/details/146965243?spm1011.2415.3001.10575sharefrommp_manage_link2、选择排序详细解释和java代码实现见以下文章https://blog.csdn.net/zxmda/article/details/146965243?spm1011.2415.3001.10575sharefrommp_manage_linkhttps://blog.csdn.net/zxmda/article/details/146965243?spm1011.2415.3001.10575sharefrommp_manage_link3、插入排序1算法思想①将数组分为已排序部分和未排序部分。②初始时已排序部分只有一个元素数组的第一个元素未排序部分包含其余所有元素。③从未排序部分取出一个元素通常是第一个元素在已排序部分找到合适的位置插入。④重复上述过程直到未排序部分为空整个数组变为有序。2图示表示3java代码实现--for循环import java.util.Arrays; public class InsertionSort{ public static void main(String[] args){ int[] arr {4,6,8,9,2,0,1,3,7,5}; insertionSort(arr); //采用Arrays类重写的toString方法进行数组表示 System.out.println(Arrays.toString(arr)); //采用for each进行数组表示 for(int x : arr) System.out.print(x ); } public static int[] insertionSort(int[] a){ int temp; //每次排序未排序好的第一个元素的索引 for(int i 1; i a.length; i){ //未排好序列的第一个元素的索引从后往前依次比较 for(int j i ; j 0; j--){ //若发现元素大于前一个元素互换 if(a[j] a[j -1]){ temp a[j]; a[j] a[j - 1]; a[j - 1] temp; }else{//如果没有退出本轮排序 break; } } } return a; } }结果java代码实现--Comparable接口import java.util.Arrays; public class InsertionSort{ public static void main(String[] args){ Integer[] arr {4,6,8,9,2,0,1,3,7,5}; sort(arr); System.out.println(Arrays.toString(arr)); for(Integer x : arr) System.out.print(x ); } //对数组排序 public static void sort(Comparable[] a){ for(int i 1; i a.length; i){ for(int j i; j 0; j--){ if(greater(a[j - 1],a[j])){ exch(a, j, j - 1); }else{ break; } } } } //判断a是否大于b private static boolean greater(Comparable a, Comparable b){ return a.compareTo(b) 0; } //交换数组a索引为i和j的元素 private static void exch(Comparable[] a, int i ,int j){ Comparable temp a[i]; a[i] a[j]; a[j] temp; } }结果二、高级排序算法1、希尔排序1算法思想①分组排序将数组按照一定的间隔h分成若干子序列每个子序列内部进行插入排序。②逐步减小间隔随着排序的进行逐渐减小子序列的间隔直到间隔为1。③最终排序当间隔减小到1时整个数组基本有序再进行一次普通的插入排序。间隔h的初始化及递减的规则int h 1; //h的初始化 while(h a.length / 2){ h h *2 1; } //h的递减规则 h h / 2;2图示表示3java代码实现--Comparable接口import java.util.Arrays; public class ShellSort{ public static void main(String[] args){ Integer[] arr {4,6,8,9,2,0,1,3,7,5}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(Comparable[] a){ //间隔h的初始化 int h 1; while(h a.length / 2){ h h * 2 1; } //当间隔h 1时进行排序 while(h 0){ //每一轮排序中的第一个要插入的元素 for(int i h; i a.length ; i){ //和前面的最后一个元素进行比较 for(int j i; j h; j j - h){ if(greater(a[j - h], a[j])){ exch(a, j - h, j); }else{ break; } } } h h / 2; } } private static boolean greater(Comparable a, Comparable b){ return a.compareTo(b) 0; } private static void exch(Comparable[] a, int i ,int j){ Comparable temp a[i]; a[i] a[j]; a[j] temp; } }结果2、归并排序1递归函数自己调用自己为递归。2算法思想①分解将数组分成两半直到每个子数组只有一个元素。②排序递归地对每个子数组进行归并排序。③合并将排序后的子数组合并成一个有序的数组。3图示表示4java代码实现--Comparable接口import java.util.Arrays; public class MergeSort{ private static Comparable[] arr; public static void main(String[] args){ Integer[] a {4,6,8,9,2,0,1,3,7,5}; sort(a); System.out.println(Arrays.toString(a)); } private static void sort(Comparable[] a){ arr new Comparable[a.length];//初始化一个和a大小相同的数组 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) / 2; //左数组排序 sort(a, lo, mid); //右数组排序 sort(a, mid 1, hi); //归并 merge(a, lo, mid, hi); } //比较a是否小于b private static boolean less(Comparable a, Comparable b){ return a.compareTo(b) 0; } //交换数组a的索引为i和j的元素 private static void exch(Comparable[] a, int i ,int j){ Comparable temp a[i]; a[i] a[j]; a[j] temp; } // public static void merge(Comparable[] a, int lo, int mid, int hi){ int i lo; int p1 lo; int p2 mid 1; while(p1 mid p2 hi){ if(less(a[p1],a[p2])){ arr[i] a[p1]; }else{ arr[i] a[p2]; } } while (p1 mid) { arr[i] a[p1]; } while (p2 hi) { arr[i] a[p2]; } for (int k lo; k hi; k) { a[k] arr[k]; } } }结果3、快速排序