十大排序算法总结
目录
引用
解释排序的意思…(迟更)
一、选择排序算法
1.详解过程(迟更)
流程图
动态流程图
2.代码段以解释
public class Sample04 {
public static void main(String[] args) {
//1.声明一个数组
int[] arr = new int[]{8,9,2,6,7,1,4,5,3};
//2.循环第几轮
for (int i = 0; i < arr.length - 1; i++) { //-1 n个数字没有第n轮
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
swap(arr,i,j);
}
}
}
print(arr);
}
//[1, 2, 3, 4, 5]
public static void print(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i == arr.length - 1) {
System.out.println("]");
} else {
System.out.print(", ");
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];![在这里插入图片描述](https://img-blog.csdnimg.cn/20210123232541510.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2MzE2OTcw,size_16,color_FFFFFF,t_70#pic_center)
arr[i] = arr[j];
arr[j] = temp;
}
}
二、冒泡排序算法
1.详解过程(迟更)
流程图
动态流程图
2.代码段及解释
public class Sample05 {
public static void main(String[] args) {
int[] arr = new int[]{8,9,2,6,7,1,4,5,3};
for (int i = 0; i < arr.length - 1; i++) {//-1 表示n个数字只有n-1轮
for (int j = 0; j < arr.length - 1 - i; j++) {//-1 避免重复比较(当前最大和上一轮最大)(同时防止第1轮溢出)
if (arr[j] > arr[j + 1]) {
swap (arr,j,j+1);
}
}
}
print(arr);
}
public static void print(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i == arr.length - 1) { //等于最后一个角标了
System.out.println("]");
} else {
System.out.print(", ");
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
三、插入排序算法
1.详解过程(迟更)
流程图
动态流程图
2.代码段及解释
public class Sample06 {
public static void main(String[] args) {
int[] arr = new int[]{8,9,2,6,7,1,4,5,3};
for (int i = 1; i < arr.length; i++) {
int e = arr[i];
int j = 0;
for (j = i; j > 0 && arr[j-1] > e; j--) {
arr[j] = arr[j - 1];
}
arr[j] = e;
}
print(arr);
}
//[1, 2, 3, 4, 5]
public static void print(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i == arr.length - 1) {
System.out.print("]");
} else {
System.out.print(", ");
}
}
}
}
四、计数排序算法
1.详解过程(迟更)
流程图
动态流程图
2.代码段及解释
public class Sample01 {
public static void main(String[] args) {
int[] arr = new int[]{2,3,1,-2,2,7,8,9,12,10,7,5,6,-1,-2,-3,9,8,7};
//1.找到最大值和最小值
int min = arr[0];
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
//2.确定桶的个数
int[] temp = new int[max - min + 1];
//3.确定对应关系
//index = number - min
//number = index + min
for (int i = 0; i < arr.length; i++) {
temp[arr[i] - min]++;
}
//temp[index] 表示index对应的数字number出现的次数
int k = 0;
for (int index = 0; index < temp.length; index++) {
while (temp[index] != 0) {
arr[k] = index + min;
k++;
temp[index]--;
}
}
print(arr);
}
public static void print(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i == arr.length - 1) {
System.out.print("]");
} else {
System.out.print(", ");
}
}
}
}
五、基数排序算法
1.详解过程(迟更)
流程图
动态流程图
2.代码段及解释
import java.util.LinkedList;
public class Sample02 {
public static void main(String[] args) {
int[] arr = new int[]{2,4,55,86,8,97,101,32,6,2,1,304,64,7,2,9,60};
//1.找出最大值,判断有几轮
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
int radex = (max + "").length();//给max数字拼一个字符串,取其长度
//2.创建另一个数组就是十个桶,每个桶是一个LinkedList
LinkedList<Integer>[] queues = new LinkedList[10];
for (int i = 0; i < queues.length; i++) {
queues[i] = new LinkedList<Integer>();
}
//3.进行对数字的分类和规整
/*
r=0 个位
r=1 十位
r=2 百位
.....
*/
for (int r = 0; r < radex; r++) {
//先按照每轮r进行分类
for (int i = 0; i < arr.length; i++) {
int index = getIndex(arr[i],r);//获取数字的r位 返回该数字要去的桶的角标0~9
queues[index].offer(arr[i]);//将把数组arr中按r位的数放在对应的数组queues中
//offer将指定元素添加到此列表的末尾(最后一个元素)
}
//然后再重新规整赋值到arr里
int k = 0;
for (int index = 0;index < queues.length; index++) {
while (!queues[index].isEmpty()) {
arr[k++] = queues[index].poll();//poll获取并移除此列表的头(第一个元素)
}
}
}
print(arr);
}
public static int getIndex(int number, int r) {
/*
123 r=0 个位 123 % 10= 3
123 r=1 十位 12 % 10 =2
123 r=2 百位 1 % 10 =1
*/
int index = 0;
for (int i = 0; i <= r; i++) {
index = number % 10;
number /= 10;
}
return index;
}
public static void print(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i == arr.length - 1) {
System.out.print("]");
} else {
System.out.print(", ");
}
}
}
}