冒泡排序
冒泡排序是把较小的数据往前调或者把较大的数据往后调。主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个依次进行比较和交换,就能达到排序目的。
1 //冒泡排序 2 public static void bubbleSort(int[] arr) { 3 for (int i = 0; i < arr.length - 1; i++) { 4 for (int j = 0; j < arr.length - 1 - i; j++) { 5 if (arr[j] > arr[j + 1]) { 6 int temp = arr[j]; 7 arr[j] = arr[j + 1]; 8 arr[j + 1] = temp; 9 } 10 } 11 } 12 }
插入排序
将一个记录插入到已排好序的序列中,从而得到一个新的有序序列,将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序
1 //直接插入排序 2 public static void insertSort(int[] arr) { 3 //从第二个数字开始 4 for (int i = 1; i < arr.length; i++) { 5 //当前数字小于前一个数 6 if (arr[i] < arr[i - 1]) { 7 //当前数字保存至临时变量 8 int temp = arr[i]; 9 int j; 10 //遍历当前数字之前的所有数字进行比较,是否大于当前数字 11 for (j = i - 1; j >= 0 && temp < arr[j]; j--) { 12 //把满足条件的数字向后移位 13 arr[j + 1] = arr[j]; 14 } 15 //不满足条件则表示当前数字比临时变量的数字小 16 arr[j + 1] = temp; 17 } 18 } 19 }
选择排序
选择排序是为每一个位置选择当前最小的元素。首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”的选择,直至完成第(n-1)个位置的元素选择,则第n个位置就只剩唯一的最大元素,此时不需再进行选择。
1 //选择排序 2 public static void selectSort(int[] arr) { 3 //遍历所有元素 4 for (int i = 0; i < arr.length; i++) { 5 //记录最小值得下标 6 int minIndex = i; 7 //与后面每个元素进行比较 8 for (int j = i + 1; j < arr.length; j++) { 9 //如果有元素比minIndex还小 10 if (arr[minIndex] > arr[j]) { 11 //则当前元素就位minIndex 12 minIndex = j; 13 } 14 } 15 //如果当前下标和minIndex不相等,说明它比minIndex还小,那么就移位 16 if (i != minIndex) { 17 int temp = arr[i]; 18 arr[i] = arr[minIndex]; 19 arr[minIndex] = temp; 20 } 21 } 22 }
快速排序
通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序
1 //快速排序 2 public static void QuickSort(int[] arr, int start, int end) { 3 //记录基准数 4 int stard = arr[start]; 5 //低位起始下标 6 int low = start; 7 //高位起始下标 8 int higt = end; 9 //满足start<end保证数据不会多余重复比较 10 if (start < end) { 11 //低位下标小于高位下标,开始比较 12 while (low < higt) { 13 //低位下标小于高位下标,并且高位数大于等于基准数 14 while ((low < higt) && stard <= arr[higt]) { 15 //高位数依次向前比较 16 higt--; 17 } 18 //不满足条件时,当前高位数覆盖当前低位数,第一次覆盖时低位数是基准数 19 arr[low] = arr[higt]; 20 //低位下标小于高位下标,并且低位数小于等于基准数 21 while ((low < higt && arr[low] <= stard)) { 22 //低位数依次向后比较 23 low++; 24 } 25 //不满足条件时,当前低位数覆盖当前高位数 26 arr[higt] = arr[low]; 27 } 28 //比较完成后,高位数下标和低位数下标重合,把基准数赋值给重合的位置 29 arr[higt] = stard; 30 //继续递归排序低位数 31 QuickSort(arr, start, low); 32 //继续递归排序高位数 33 QuickSort(arr, low + 1, end); 34 } 35 }
归并排序
归并排序是把集合递归划分成为两个短集合,再将两个集合各自再分成两组组。依次类推,当分出来的一个集合只有一个数据时,可以认为这个集合内已经达到了有序,然后再合并相邻的二个集合就可以了。这样通过先递归的分解集合,再合并集合就完成了归并排序。
1 //归并排序 2 public static void mergeSort(int[] arr, int low, int high) { 3 int middle = (low + high) / 2; 4 if (low < high) { 5 //处理左边 6 mergeSort(arr, low, middle); 7 //处理右边 8 mergeSort(arr, middle + 1, high); 9 //归并 10 merge(arr, low, middle, high); 11 } 12 } 13 14 public static void merge(int[] arr, int low, int middle, int high) { 15 //临时数组 16 int[] temp = new int[high - low + 1]; 17 //临时数组下标记录 18 int index = 0; 19 //第一组需要遍历的起始下标 20 int i = low; 21 //第二组需要遍历的起始下标 22 int j = middle + 1; 23 //遍历两个数组,取出最小数放入临时数组 24 while (i <= middle && j <= high) { 25 if (arr[i] <= arr[j]) { 26 temp[index] = arr[i]; 27 i++; 28 } else { 29 temp[index] = arr[j]; 30 j++; 31 } 32 index++; 33 } 34 //处理多余的数据 35 while (j <= high) { 36 temp[index] = arr[j]; 37 j++; 38 index++; 39 } 40 while (i <= middle) { 41 temp[index] = arr[i]; 42 i++; 43 index++; 44 } 45 //把临时数组中的数据重新放入原数组 46 for (int k = 0; k < temp.length; k++) { 47 arr[k + low] = temp[k]; 48 49 } 50 }