插入排序
设计思路:
第一、选取第二个元素作为《插入元素》insert_num
第二、定义排好序的元素中最大的数的下标j,默认为第0个
第三、用insert_num与排好序的数逐个比较,如果小于,则插入
如1352,插入数为2,排好序的数为135
1.5大于2,把5后移动一位,13_5
2.3大于2,把3往后移动一位,1_35
3.1大于2,不符合,则把2插入到1后面的位置,1235
private static void insertSort(int[] a){
for (int i = 1; i < a.length; i++) {
int insert_num = a[i];//插入数,第一个
int j = i - 1;//排好序的元素中最大的数的下标,第0个
/**
* 135,2
*/
while (j >= 0 && a[j] > insert_num) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = insert_num;
}
for (int i : a) {
System.out.println(i);
}
}
时间复杂度:最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)
快速排序
设计思路:
{5,7,6,4,8}
5 7 6 4 8 -> 数值
0 1 2 3 4 -> 指针下标
1、选第0个位置的数作为mid,如5
2、定义指针i、j,分别用于右移、左移,当mid<=j位置的数,j–,如5<=8,j–,5<=4,j停止,此时j=3
当mid>=i位置的数,i++,如5>=5,i++,5>=7,i停止,i=1;此时,把7和4交换位置,变成{5,4,6,7,8}
3、重复第2步,j=1,i=1,没有可移动的位置了,结束,把mid插入i的位置,把i位置的数插入到0位置
4、此时变成,以5为中位数的数组,分成两块数组,如果左右两个数组还需要排序,则,重复123步骤就行
/**
* 快速排序(二分排序)
* @param arr
* @param low
* @param hight
*/
private static void sort(int[] arr,int low,int hight){
//int[] arr = {5,7,6,4,8};{6,4,5,7,8}
int i,j,mid,temp;
i = low;
j = hight;
if(low > hight){
return;
}
mid = arr[low];
while (i < j){
while (i < j && mid <= arr[j]){
j--;
}
while (i < j && arr[i] <= mid){
i++;
}
if(i < j) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[low] = arr[i];
arr[i] = mid;
sort(arr,low,i - 1);
sort(arr,i +1,hight);
}
最短路径算法
求任意两点之间的最短路径大小,以及路径
在这里插入代码片
package com.example.demo.suanfa;
public class Main{
public static void main(String[] args){
//创建顶点名称,获取方便后面打印路径
String[] vax={"V0","V1","V2","V3"};
int len=vax.length;
int[][] path=new int[len][len];
int[][] graph=creat_Graph(len,path);
//使用动态规划获取最短路径
floyd(graph,len,vax,path);
//打印线路(u,v)路径
print_road(path,vax,0,2);
}
public static void print_road(int[][]path,String[] vax,int u,int v){
if (path[u][v] == -1){
System.out.print(vax[u]);
System.out.print("---->");
System.out.print(vax[v]);
}else {
int tem = path[u][v];
print_road(path,vax,u,tem);
print_road(path,vax,tem,v);
}
}
public static void floyd(int[][] graph,int len,String[] vax,int[][] path){
for (int k = 0; k < len; k++) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (graph[i][k] + graph[k][j] < graph[i][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
//path记录路径
path[i][j] = k;
}
}
}
}
}
public static int[][] creat_Graph(int len,int[][] path) {
//创建邻接矩阵
int m = 99999;
int[][] graph = new int[len][len];
//初始化邻接矩阵
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph[0].length; j++) {
if (i == j) {
graph[i][j] = 0;
}else {
graph[i][j] = m;
}
//将path初始化为j
path[i][j] = -1;
}
}
//根据图输入数据
graph[0][1] = 5;
graph[0][3] = 7;
graph[1][2] = 4;
graph[1][3] = 2;
graph[2][0] = 3;
graph[2][1] = 3;
graph[2][3] = 2;
graph[3][2] = 1;
return graph;
}
}