若看到这篇文章的小伙伴发现内容有错误,请告诉我改正。
一、简单排序算法
1、冒泡排序
详细解释和java代码实现见以下文章:
https://blog.csdn.net/zxmda/article/details/146965243?spm=1011.2415.3001.10575&sharefrom=mp_manage_linkhttps://blog.csdn.net/zxmda/article/details/146965243?spm=1011.2415.3001.10575&sharefrom=mp_manage_link2、选择排序
详细解释和java代码实现见以下文章:
https://blog.csdn.net/zxmda/article/details/146965243?spm=1011.2415.3001.10575&sharefrom=mp_manage_linkhttps://blog.csdn.net/zxmda/article/details/146965243?spm=1011.2415.3001.10575&sharefrom=mp_manage_link3、插入排序
1)算法思想
①将数组分为已排序部分和未排序部分。
②初始时,已排序部分只有一个元素(数组的第一个元素),未排序部分包含其余所有元素。
③从未排序部分取出一个元素(通常是第一个元素),在已排序部分找到合适的位置插入。
④重复上述过程,直到未排序部分为空,整个数组变为有序。
2)图示表示
3)java代码实现--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)图示表示
3)java代码实现--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)图示表示
4)java代码实现--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、快速排序