|
|
@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
# 算法的5个特点
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.有穷性
|
|
|
|
|
|
|
|
2.确定性(确定的执行流程或者确定的尝试流程)
|
|
|
|
|
|
|
|
3.可行性
|
|
|
|
|
|
|
|
4.输入
|
|
|
|
|
|
|
|
5.输出
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 选择排序
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
双层循环,内层循环完成后获取最小值,内层循环每次将最小值放到i位置。
|
|
|
|
|
|
|
|
0-i之间认为是有序,i-n之间是原始数据,从i-n之间选择最小的元素放到index为i的地方。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意数组的交换,小于号避免相同元素交换位置。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
private static void selectionSort(int[] arr) {
|
|
|
|
|
|
|
|
if (arr == null || arr.length < 2) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int length = arr.length;
|
|
|
|
|
|
|
|
int tmp;
|
|
|
|
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
|
|
|
|
int index = i;
|
|
|
|
|
|
|
|
for (int j = i; j < length; j++) {
|
|
|
|
|
|
|
|
// 小于号避免位置交换
|
|
|
|
|
|
|
|
index = arr[j] < arr[index] ? j : index;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (index == i) {
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
tmp = arr[i];
|
|
|
|
|
|
|
|
arr[i] = arr[index];
|
|
|
|
|
|
|
|
arr[index] = tmp;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 冒泡排序
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
双层循环,内层循环两两交换,内层循环完成后将最大值冒泡到最右边。
|
|
|
|
|
|
|
|
外层循环index从大到小,内层循环index从小到大。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
private static void bubbleSort(int[] arr){
|
|
|
|
|
|
|
|
int length = arr.length;
|
|
|
|
|
|
|
|
if (arr == null || length < 2) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int tmp;
|
|
|
|
|
|
|
|
for (int i = length - 1; i >= 0; i--) {
|
|
|
|
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
|
|
|
|
|
|
if (arr[j + 1] < arr[j]) {
|
|
|
|
|
|
|
|
tmp = arr[j];
|
|
|
|
|
|
|
|
arr[j] = arr[j + 1];
|
|
|
|
|
|
|
|
arr[j + 1] = tmp;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 插入排序
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
每次获取原始数据最前面的那个元素交换到左侧已经有序的数组。
|
|
|
|
|
|
|
|
双层循环,外层循环每次递增并获取i,内层循环使用i挨个和0-1的数据比较并交换。如果i比i-1大或者内层循环到了最左侧则终止循环。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
private static void insertSort(int[] arr){
|
|
|
|
|
|
|
|
int length = arr.length;
|
|
|
|
|
|
|
|
if (arr == null || length < 2) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int tmp;
|
|
|
|
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
|
|
|
|
for (int j = i; j > 0; j--) {
|
|
|
|
|
|
|
|
if (arr[j - 1] > arr[j]) {
|
|
|
|
|
|
|
|
tmp = arr[j - 1];
|
|
|
|
|
|
|
|
arr[j - 1] = arr[j];
|
|
|
|
|
|
|
|
arr[j] = tmp;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 排序算法的稳定性问题???
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在涉及到元素交换的时候,判断不使用等于,则相同的元素不会被交换。
|