数据结构与算法

插入排序

设计思路:
第一、选取第二个元素作为《插入元素》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;
        }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值