赞
踩
这里引入百度百科的解释:
将需要处理的数据加载到内部存储器(内存)中进行排序
其中1-5 比较类排序
5-7 非比较类排序
内外存结合
package com.lingo.sort; import java.util.Arrays; public class BubbleSortT { public static void sort(int[] arr) { for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44, 15}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 15, 22, 44, 55, 66]
import java.util.Arrays; public class SelectionSortT { public static void sort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int min = i; for (int j = i + 1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } if (min != i) { int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44, 15}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 15, 22, 44, 55, 66]
import java.util.Arrays; public class InsertionSortT { public static void sort(int[] arr) { for (int i = 1; i < arr.length; i++) { int temp = arr[i]; int j = i; while (j > 0 && temp < arr[j - 1]) { //从该处至函数末尾,temp可以换成arr[i]吗? arr[j] = arr[j - 1]; j--; } if (i != j) { arr[j] = temp; } } } public static void main(String[] args) { int[] arr = {9, 5, 1, 11, 55, 66, 5, 3, 2, 6, 22, 44, 15}; sort(arr); System.out.println(Arrays.toString(arr)); } }
这里给大家一个思考:
上面的temp可以改成arr[i]吗?
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 15, 22, 44, 55, 66]
引入一张动图,大家就可清楚了解希尔排序了
import java.util.Arrays; public class ShellSortT { public static void sort(int[] arr) { for (int group = arr.length / 2; group > 0; group = group / 2) { //若10个数据则被分成5个组 //0与5 1与6 for (int i = group; i < arr.length; i++) { int temp = arr[i]; int j = i; while (j - group >= 0 && temp < arr[j - group]) { arr[j] = arr[j - group]; j = j - group; } if (j != i) { arr[j] = temp; } } } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 22, 44, 55, 66]
引入一张动图,大家就可清楚了解希尔排序了
如果还不理解,那就再给你加点料
下面是最全的归并排序的示例图了
主要的思想还是分治思想
import java.util.Arrays; public class MergeSortT { public static void sort(int[] arr) { int[] temp = new int[arr.length]; divide(arr, 0, arr.length - 1, temp); } /** * 分 * * @param arr * @param left * @param right * @param temp */ private static void divide(int arr[], int left, int right, int[] temp) { if (left < right) { int mid = left + (right - left) / 2; //左分 divide(arr, left, mid, temp); //右分 divide(arr, mid + 1, right, temp); //合 merge(arr, left, mid, right, temp); } } ; /** * 治 * * @param arr * @param left * @param mid * @param right * @param temp 临时数组 */ private static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; int j = mid + 1; //临时存放数组下标索引 int t = 0; //第一种情况: while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[t] = arr[i]; i++; t++; } else { temp[t] = arr[j]; j++; t++; } } //代码执行到这里说明 i<=mid && j<=right 至少有一条不符合条件了 while (j <= right) { temp[t] = arr[j]; j++; t++; } while (i <= mid) { temp[t] = arr[i]; i++; t++; } //拷贝 t = 0; int tempLeft = left; while (tempLeft <= right) { arr[tempLeft] = temp[t]; t++; tempLeft++; } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44, 15}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 15, 22, 44, 55, 66]
排序流程:
引入一张动图,大家就可清楚了解快速排序了

import java.util.Arrays; public class QuickSortFirstT { public static void sort(int[] arr) { sort(arr, 0, arr.length - 1); } private static void sort(int[] arr, int left, int right) { if (left >= right) { return; } int i = left; int j = right; int piovt = arr[left];//基准 while (i < j) { //右指针向左走 while (i < j && piovt < arr[j]) { j--; } //执行到这里 说明 piovt>=arr[j] if (i < j) { arr[i++] = arr[j]; } //左指针向右走 while (i < j && piovt > arr[i]) { i++; } //同理 if (i < j) { arr[j--] = arr[i]; } } //代码执行到这里说明i==j //空出的位置 我们存放基准 此时 基准左边全是比基准小的值 右边全是比基准大的值 arr[i] = piovt; //左边的递归排序 sort(arr, left, i - 1); //右边的递归排序 sort(arr, i + 1, right); } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 22, 44, 55, 66]
排序流程(以升序举例):
引入一张动图,大家就可清楚了解堆排序了
这里给大家引入以为UP主对堆排序的介绍以及实现的文章
大家可以参考学习下:
https://www.cnblogs.com/chengxiao/p/6129630.html
import java.util.Arrays; public class HeapSortT { /** * 调整为大根堆(大顶堆) * * @param arr 待调整数组 * @param start 从哪一个节点开始 * @param length 待调整的长度 */ private static void adjust(int[] arr, int start, int length) { //获取左孩子节点 这里的i = 2*i+1 解释下 //这里是被交换的孩子节点变成了父节点,此时这棵树已经被调整了 但是被交换位置可能还会有他的子树 //因此 i = 2*i+1 是继续调整原父节点的子树 int temp = arr[start]; for (int i = 2 * start + 1; i < length; i = 2 * i + 1) { if (i + 1 < length && arr[i] < arr[i + 1]) { i++; } //较大的子节点的值大于父节点,将子节点的值赋值给父节点 //子节点的值无需改变 ,因为temp已经保存了原父节点的值 //之后再进行循环判断时 仍比较的是原temp **** if (arr[i] > temp) { arr[start] = arr[i]; //将交换的子节点的坐标赋值给父节点 start = i; //如果没有进行交换则跳出循环 } else { break; } } //循环进行完毕之后 //此时的arr[start]应该被赋值temp arr[start] = temp; } public static void sort(int[] arr) { //从下至上 从左至右 第一个非叶子节点应该为(arr.length/2-1) //第一将整棵树调整为大根堆的树 for (int i = arr.length / 2 - 1; i >= 0; i--) { adjust(arr, i, arr.length); } //开始交换 for (int i = arr.length - 1; i > 0; i--) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; //这里的范围应该为i 会存在写arr.length-i(这里如果lengh = arr.length-i 说明思路正确,但没有认真思考i的值) adjust(arr, 0, i); } } public static void main(String[] args) { int[] arr = {1, 3, 3, 2, 4, 4, 4, 8, 7}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 3, 4, 4, 4, 7, 8]
排序流程(以升序举例):
import java.util.*; public class BucketSort { public static void sort(int[] arr) { //获取最大值以及最小值 int max = arr[0]; int min = arr[0]; for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); min = Math.min(min, arr[i]); } sort(arr, max, min); } private static void sort(int[] arr, int max, int min) { //得到多少个桶 这里也会出现极端情况 桶只存在一个 int bucketNum = (max - min) / arr.length + 1; List<Integer>[] bucketArray = new ArrayList[bucketNum]; for (int i = 0; i < arr.length; i++) { int t = (arr[i] - min) / (arr.length); if (bucketArray[t] == null) { bucketArray[t] = new ArrayList<>(); } bucketArray[t].add(arr[i]); } //对桶内元素排序 这里可以采用任意的排序方式 for (int i = 0; i < bucketArray.length; i++) { if (bucketArray[i] != null && bucketArray[i].size() > 0) { //这里采用Collections.sort() 归并排序的plus Collections.sort(bucketArray[i]); } } //合并 int index = 0; for (int i = 0; i < bucketArray.length; i++) { //可能存在空桶的可能性 if (bucketArray[i] == null) { continue; } for (int j = 0; j < bucketArray[i].size(); j++) { arr[index] = bucketArray[i].get(j); index++; } } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 22, 44, 55, 66]
排序流程:
引入一张动图,大家就可清楚了解基数排序了
import java.util.Arrays; public class RadixSortT { public static void sort(int[] arr) { //防止数组中数据均存放在一个桶中,导致溢出 int[][] bucket = new int[10][arr.length]; int[] bucketElementCounts = new int[10]; //取出最大数的位数 int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } int maxLength = (max + "").length(); for (int i = 0, n = 1; i < maxLength; i++, n *= 10) { for (int j = 0; j < arr.length; j++) { int t = arr[j] / n % 10; bucket[t][bucketElementCounts[t]] = arr[j]; bucketElementCounts[t] = bucketElementCounts[t] + 1; } int index = 0; for (int j = 0; j < bucketElementCounts.length; j++) { if (bucketElementCounts[j] != 0) { for (int k = 0; k < bucketElementCounts[j]; k++) { arr[index] = bucket[j][k]; index++; } } bucketElementCounts[j] = 0; } } } public static void main(String[] args) { int[] arr = {1, 5, 9, 11, 55, 66, 5, 3, 2, 6, 22, 44}; sort(arr); System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 3, 5, 5, 6, 9, 11, 22, 44, 55, 66]
首先给大家看一下排序的总结表
通过时间复杂可以清晰看出排序的效率其中涉及的思想:分治思想,以空间换时间思想等
当然,里面所涉及的排序代码可能仍存在各种问题,欢迎大家积极同我探讨交流学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。